it-swarm.com.ru

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

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

App navigation tree

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

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

Что я ожидаю:

  • когда пользователь находится на Подробности 5 Activity и нажмите кнопку вверх, приложение переходит к List 3 Activity
  • когда пользователь находится на Detail 7 Activity и нажимает кнопку вверх, приложение возвращается к Home Activity

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

app backstack clear

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

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

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

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

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

37
ol_v_er

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

Идея состоит в том, чтобы получить стек из последних 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();

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

22
Sherif elKhatib

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

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

1. Имитация поведения кнопки «Назад».

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

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

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

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

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

2
Paul Lammertsma

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

0
Alexandre