Как перейти к тому же родительскому состоянию
Исходя из моих наблюдений из приложения 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's 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's task, so simply
// navigate up to the hierarchical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
}
В моем случае у меня было 3 действия, например, A B и C, когда пользователь переходил от A к B I, ставил некоторые дополнительные функции и onCreate
В B I эти дополнения используются для запроса данных из базы данных, чтобы заполнить мои строки, и когда я возвращаюсь назад из C, все дополнения исчезают, и действие B ничего не показывает.
5 ответов
"Стандартное" поведение для действия Android состоит в том, что создается новый экземпляр действия каждый раз, когда для этого действия создается новое намерение (см. LaunchMode-document здесь). Из-за этого ваши статисты, кажется, исчезли, если вы вызываете navigateUpTo.
В вашем случае я бы посоветовал использовать
android:launchMode="singleTop"
для вашей родительской активности в вашем AndroidManifest.xml. Таким образом, вы вернетесь к существующему действию (если оно находится на вершине заднего стека вашей задачи). Таким образом, ваши статисты будут сохранены.
Я тоже не понимаю, почему это не упоминается в документе Google, который вы цитируете, так как это поведение, которое можно ожидать при использовании навигации вверх.
Это альтернативное решение принятого ответа:
Если вы не можете изменить 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);
У меня была похожая проблема, когда я вызывал startActivityForResult() в своей основной деятельности с фрагментами, а затем пытался вернуться к ней из вызываемого, используя навигацию Up. Решено путем реализации навигации вверх как:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
setResult(RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
В этом случае кнопка "Вверх" ведет себя как обычная кнопка "Назад", и все состояния сохраняются.
Вы можете использовать это:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Вам нужно будет сохранить состояние родительской активности и восстановить его после возврата из вызывающей.
См. Сохранение состояния активности Android с помощью Save Instance State для полного объяснения предварительной обработки с кодом.