У меня есть специальный случай для этой проблемы.
В моем проекте все идет хорошо, он может скомпилироваться и успешно скомпилироваться, но в моей среде Android Studio IDE (и я также пробовал Intelligent IDEA, они в той же ситуации), файл R.java может не должны быть хорошо решены и всегда должны быть красными.
Это почти сошло с ума, я не могу вынести цвет чтения, когда я программирую.
Наконец-то я обнаружил, что эта сложная проблема возникает из-за моего размера файла R.java. Мой проект очень большой, он поддерживает множество многоязычных и многоэкранных размеров. Существует так много ресурсов, что размер моего файла R.java составляет около 2.5M.
Максимальный размер файла в Android Studio составляет 2,5 М в настройках по умолчанию, поэтому файлы, превышающие этот предел, не могут быть хорошо решены. И вы можете изменить настройки по умолчанию в «AndroidStudio-root / bin / idea.properties».
изменить эту строку:
idea.max.intellisense.filesize=2500
на:
idea.max.intellisense.filesize=5000
Затем перезапустите студию Android, красный цвет уволен, я могу запрограммировать еще раз.
Из вашего FirstActivity
вызова SecondActivity
с помощью метода startActivityForResult()
Например:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
В вашем SecondActivity
установите данные, которые вы хотите вернитесь к FirstActivity
. Если вы не хотите возвращаться назад, не устанавливайте никаких параметров.
Например: В SecondActivity, если вы хотите отправить обратно данные:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
t хотите вернуть данные:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
Теперь в вашем классе FirstActivity напишите следующий код для метода onActivityResult()
.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//onActivityResult
Сначала вы используете startActivityForResult()
с параметрами в первом Activity
, и если вы хотите отправить данные с второго Activity
на первый Activity
, то передайте значение с помощью Intent
с помощью метода setResult()
и получите эти данные внутри onActivityResult()
в первом Activity
.
Ответ автора @Nishant верен. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установило эту строку в манифесте Android.
<activity android:name=".SecondViewActivity"
android:parentActivityName=".FirstActivity"/>
Если это так, удалите android:parentActivityName=".FirstActivity"
Для тех, у кого проблема с неправильным кодом запроса в onActivityResult
Если вы вызываете startActivityForResult()
из вашего Fragment
, код запроса изменяется с помощью Activity, который владеет Fragment.
Если вы хотите получить правильный результатCode в своей деятельности, попробуйте это:
Изменить:
startActivityForResult(intent, 1);
To:
getActivity().startActivityForResult(intent, 1);
Если вы хотите обновить пользовательский интерфейс с результатом деятельности, вы не сможете использовать this.runOnUiThread(new Runnable() {}
. При этом пользовательский интерфейс не будет обновляться с новым значением. Вместо этого вы можете сделать это:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED) {
return;
}
global_lat = data.getDoubleExtra("LATITUDE", 0);
global_lng = data.getDoubleExtra("LONGITUDE", 0);
new_latlng = true;
}
@Override
protected void onResume() {
super.onResume();
if(new_latlng)
{
PhysicalTagProperties.this.setLocation(global_lat, global_lng);
new_latlng=false;
}
}
Это кажется глупым, но работает очень хорошо.
Дополняя ответ от @ Nishant, лучший способ вернуть результат активности:
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
У меня возникла проблема с
new Intent();
. Тогда я узнал, что правильный способ использует
getIntent();
для получения текущего намерения
Intent
, который существует только для хранения Bundle
и не имеет нормальных значений, таких как действие или компонент. Но это также немного странно (и потенциально опасно?), Чтобы изменить Intent
, который использовался для запуска текущей активности. Поэтому я искал источник для самого Android и обнаружил, что он всегда создает новый Intent
для использования в качестве результата. Например, github.com/aosp-mirror/platform_frameworks_base/blob/…
– spaaarky21
29 June 2018 в 16:52
Как проверить результат из основного действия?
Вам нужно переопределить
Activity.onActivityResult()
, а затем проверить его параметры:
requestCode
определяет, какое приложение вернуло эти результаты. Это определяется вами, когда вы вызываетеstartActivityForResult()
.resultCode
сообщает вам, удалось ли это приложение, не удалось или что-то другоеdata
содержит любую информацию, возвращаемую этим приложение. Это может бытьnull
.
Очень распространенная проблема в android. Она может быть разбита на 3 части. 1) Запустите Activity B (происходит в действии A). 2) Установите запрошенные данные (происходит в активности B). 3) Получите запрошенные данные (происходит в действии A)
1) startActivity B
blockquote>Intent i = new Intent(A.this, B.class); startActivity(i);
2) Установить запрошенные данные
blockquote>В этой части вы решить, хотите ли вы отправить данные назад или нет, когда происходит конкретное событие. Например: В операции B есть EditText и две кнопки b1, b2. Нажатие на кнопку b1 возвращает данные обратно в actvity. A Щелчок по кнопке b2 не отправляет никаких данных.
Отправка данных
b1......clickListener { Intent resultIntent = new Intent(); resultIntent.putExtra("Your_key","Your_value"); setResult(RES_CODE_A,resultIntent); finish(); }
Не отправлять данные
b2......clickListener { setResult(RES_CODE_B,new Intent()); finish(); }
пользователь нажимает кнопку возврата По умолчанию результат устанавливается с кодом ответа Activity.RESULT_CANCEL
]3) Результат Retrive
blockquote>Для этого переопределить метод onActivityResult
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RES_CODE_A) { // b1 was clicked String x = data.getStringExtra("RES_CODE_A"); } else if(resultCode == RES_CODE_B){ // b2 was clicked } else{ // back button clicked } }
Пример
Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Более подробно см. мой более полный ответ .
[/g3]
MainActivity.java
public class MainActivity extends AppCompatActivity {
// Add a different request code for every activity you are starting from here
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) { // Activity.RESULT_OK
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
SecondActivity.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
SecondActivity
произошло какое-то исключение, в этом случае вам также нужно вернуть результат вFirstActivity
, чтобы вы могли установить результат как"RESULT_CANCELLED"
в блоке catch и вернуться кFirstActivty
и вFirstActivity's' 'onActivityResult()
вы можете проверить, получили ли вы результат успеха или неудачи. – Nishant 31 October 2013 в 06:42