Навигация по Android вверх для Действия с несколькими родителями

У меня есть проблема для реализации навигации в приложении с этим деревом навигации:

Дерево навигации приложения

Стандартная реализация кнопки назад в порядке.

Проблема начинается при попытке реализовать кнопку "Вверх".

Что я ожидаю:

  • когда пользователь находится на странице 5 "Активность" и нажимает кнопку "вверх", приложение переходит к Списку 3 "Активность"
  • когда пользователь находится в Detail 7 Activity и нажимает кнопку "вверх", приложение возвращается к домашней активности

Итак, другими словами, я хотел бы иметь такое поведение на заднем стеке:

очистка бэкстека приложения

В документации Android ( реализация наследственной навигации) рекомендуется использовать следующий код для управления навигацией:

Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();

Но так как родительское действие Подробного Действия отличается на различном пути навигации, я не знаю, какой это действительно. Так что я не могу назвать это в Намерении.

Есть ли способ узнать реальную родительскую активность в заднем стеке Android?

Если нет, есть ли способ реализовать правильную навигацию вверх в этом приложении?

3 ответа

Решение

Я буду придерживаться моего комментария к ответу Павла:

Идея состоит в том, чтобы иметь стек из последних Parent Деятельность пройдена. Пример:

public static Stack<Class<?>> parents = new Stack<Class<?>>();

Теперь во всех ваших родительских действиях (действия, которые считаются родителями, например, в вашем случае: List и Home), вы добавляете это к их onCreate:

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     parents.push(getClass()); 
     //or better yet parents.push(getIntent()); as @jpardogo pointed
     //of course change the other codes to make use of the Intent saved.

     //... rest of your code
}

Когда вы хотите вернуться к Parent деятельность, вы можете использовать следующее (в соответствии с вашим кодом):

Intent parentActivityIntent = new Intent(this, parents.pop());
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();

Я надеюсь, что прав (

Это сложный вопрос, и, на мой взгляд, он действительно показывает трудности, связанные с UX-решениями Android для кнопки "вверх". Поэтому нет четкого ответа на вашу проблему.

У меня есть два возможных решения для вас.

1. Подражая поведению кнопки назад.

Вы можете подумать о добавлении в намерение дополнения для запуска Detail от одного из его родителей. Эта дополнительная информация проинформирует те действия, какие действия они должны будут начать, когда android.R.id.home нажата.

Это фактически означает, что ваше приложение "возвращается" к своему общему предку, а не просто перезапускает Home.

Другим способом реализации этого может быть просто выполнение onBackPressed() вместо запуска дома с Intent.FLAG_ACTIVITY_CLEAR_TOP, но имейте в виду, что связанная анимация будет отличаться от обычного действия "вверх".

2. Пропустите промежуточные действия и идите домой.

Некоторые приложения рассматривают "кнопку вверх" как "кнопку домой". Возможно, вы захотите подумать о том, чтобы просто заново запустить Home с Intent.FLAG_ACTIVITY_CLEAR_TOP,

Это старый пост, конечно, но, поскольку я изучал SharedPreferences, я думаю, что это может быть возможность сложить эту информацию в данные sharedPreferences и изменять ее значение каждый раз, прежде чем переходить к двум родителям. Затем, прочитав его, вы сможете напрямую узнать своего родителя, и это без необходимости создавать целый класс для этого.

Другие вопросы по тегам