Как перейти в одно и то же родительское состояние
Из моего наблюдения с приложения Gmail и TED поведение навигационной системы будет перемещаться к родительскому объекту с тем же состоянием (позиция прокрутки), не похожим на то, что Google говорит в своем документе Внедрить навигацию, которая, как правило, создает намерение родителя и запускает его.
Я реализую код из кода образца Android, и все состояние ушло (все дополнительные параметры, которые я ранее задал и прокручивал позицию). Каков правильный способ? Я не могу найти какой-либо документ в Android.
Ниже приведен код:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = new Intent(this, MyParentActivity.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is not part of the application task, so create a new task
// with a synthesized back stack.
TaskStackBuilder.from(this)
.addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
.addNextIntent(new Intent(this, MyGrandParentActivity.class))
.addNextIntent(upIntent)
.startActivities();
finish();
} else {
// This activity is part of the application task, so simply
// navigate up to the hierarchical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
}
В моем случае я получил 3 действия, которые говорят AB и C, когда пользователь перемещается из A в BI, добавляет некоторые дополнительные функции, а onCreate
BI использует эти дополнительные функции для запроса данных из базы данных, чтобы заполнить мои строки и когда я вернусь обратно с C все дополнительные функции исчезли, и активность B ничего не показывает.
Ответы
Ответ 1
"Стандартное" поведение для активности android заключается в том, что создается новый экземпляр активности каждый раз, когда есть новое намерение для этого действия (см. launchMode-document здесь). Из-за этого ваши дополнительные функции, кажется, исчезли, если вы вызываете navigateUpTo.
В вашем случае я бы посоветовал использовать
android:launchMode="singleTop"
для вашей родительской активности в вашем AndroidManifest.xml. Таким образом, вы вернетесь к своей существующей деятельности (пока она находится в верхней части задней части вашей задачи). Таким образом, ваши дополнительные функции будут сохранены.
Я тоже не понимаю, почему это не упоминается в документе Google, который вы цитируете, поскольку это похоже на поведение, которое вы ожидаете, если используете навигацию.
Ответ 2
Это альтернативное решение принятого ответа:
Если вы не можете изменить launchMode
своей деятельности или если родительская активность не находится поверх верхнего стека (например, A является родителем C), вы не можете использовать решение выше. В этом случае вам нужно продлить ваш вызов navigateUpTo
, чтобы сообщить о действии, чтобы он не воссоздавался, если он находится на задней панели:
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
NavUtils.navigateUpTo(this, intent);
Ответ 3
У меня была аналогичная проблема, когда я вызвал startActivityForResult() в своем основном действии с фрагментами, а затем попытался вернуться к нему из вызываемого абонента с помощью навигации вверх.
Решено путем внедрения Up navigation как:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
setResult(RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
В этом случае кнопка "Вверх" ведет себя как обычная кнопка "Назад", и все состояния сохраняются.
Ответ 4
вы можете использовать это:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Ответ 5
Вам нужно будет сохранить состояние в родительском действии и восстановить его после возвращения из вызывающего.
См. Сохранение состояния активности Android с помощью Save Instance State для полного объяснения preocess с кодом.