SetResult не работает, когда нажата кнопка BACK
Я пытаюсь setResult после нажатия кнопки BACK. Я звоню в onDestroy
Intent data = new Intent();
setResult(RESULT_OK, data)
Но когда дело доходит до
onActivityResult(int requestCode, int resultCode, Intent data)
resultCode равен 0 (RESULT_CANCELED), а данные - "null".
Итак, как я могу передать результат из операции, завершенной кнопкой BACK?
Ответы
Ответ 1
Я реорганизовал свой код. Сначала я подготовил некоторые данные и установил их как activity result
в onDestroy
(это не сработало). Теперь я устанавливаю данные activity
каждый раз, когда данные, которые будут возвращены, обновляются и не имеют ничего в onDestroy
.
Ответ 2
Вам нужно переопределить метод onBackPressed() и установить результат перед вызовом суперкласса, i.e
@Override
public void onBackPressed() {
Bundle bundle = new Bundle();
bundle.putString(FIELD_A, mA.getText().toString());
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
super.onBackPressed();
}
Ответ 3
Activity
результат должен быть установлен , прежде чем finish()
вызывается. Нажатие кнопки BACK фактически вызывает finish()
на вашем Activity
, поэтому вы можете использовать следующий фрагмент:
@Override
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
super.finish();
}
Если вы вызываете NavUtils.navigateUpFromSameTask();
в onOptionsItemSelected()
, вызывается finish()
, но вы ошибетесь result code
. Поэтому вы должны называть finish()
not navigateUpFromSameTask
в onOptionsItemSelected()
.
неверный запросКод в onActivityResult
Ответ 4
Если вы хотите установить какое-то пользовательское событие RESULT_CODE
in onBackPressed
, тогда вам нужно сначала установить result
, а затем вызвать super.onBackPressed()
, и вы получите тот же RESULT_CODE
в активности вызывающего абонента onActivityResult
метод
@Override
public void onBackPressed()
{
setResult(SOME_INTEGER);
super.onBackPressed();
}
Ответ 5
Обратитесь onActivityResult (int, int, Intent) doc
Решение - проверить resultCode на значение Activity.RESULT_CENCELED. Если да, то это означает, что нажата кнопка BACK или произошел сбой активности. Надеюсь, он работает для вас, ребята, работает для меня:).
Ответ 6
Вы должны переопределить onOptionsItemSelected следующим образом:
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
final Intent mIntent = new Intent();
mIntent.putExtra("param", "value");
setResult(RESULT_OK, mIntent);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Ответ 7
onDestroy
слишком поздно в цепочке; вместо этого переопределите onPause
и проверьте isFinishing()
, чтобы проверить, находится ли ваша активность в конце жизненного цикла.
Ответ 8
Попробуйте переопределить onBackPressed (с уровня Android 5 вверх) или переопределить onKeyDown() и поймать KeyEvent.BUTTON_BACK (см. Результаты активности Android)
Это делает трюк для меня.
Ответ 9
Не полагайтесь на какую-либо логику, выполняемую в onPause одного действия при возврате к исходному. Согласно документам:
Реализации этого метода (onPause) должны быть очень быстрыми, потому что следующее действие не будет возобновлено до тех пор, пока этот метод не вернет
Подробнее см. http://goo.gl/8S2Y.
Самый безопасный способ - установить результат после завершения каждой операции изменения результата (как вы упомянули в своем ответе)
Ответ 10
Вставьте ответ, возможно, будет полезно другим людям:
когда набор запускается с помощью android: launchMode = "singleTask"
я также не могу получить результат,
Док говорит:
/* <p>Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.
*/
и
/* <p>As a special case, if you call startActivityForResult() with a requestCode
* >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
* activity, then your window will not be displayed until a result is
* returned back from the started activity. This is to avoid visible
* flickering when redirecting to another activity.
*/