Подтвердить что ты не робот

Какой из них использовать NavUtils.navigateUpFromSameTask() vs. onBackPressed()

У меня есть два действия A и B. У A есть ListFragment, который использует LoaderManager, тогда как активность B показывает детали элемента, выбранного в ListFragment. Я только что заметил, что, когда я использую кнопку "Назад", чтобы перейти от B к A, положение в Хранилище ListFragment, но когда я использую кнопку "вверх" (левая точка) в панели действий, действие A воссоздается, и поэтому позиция в виде списка теряется.

Я хотел бы исправить эту проблему, но я не уверен, как правильно это сделать.

Я придумываю такие решения:

a) Используйте onBackPressed()

Замените реализацию по умолчанию для android.R.id.home (кнопка панели действий вверх) в операции B, а вместо функции NavUtils.navigateUpFromSameTask(this) вызовите метод активности onBackPressed(). Я протестировал его, и он работает.

b) Продолжайте использовать NavUtils.navigateUpFromSameTask(this)

Но реализуйте позицию onSaveInstanceState и restore listView во время onCreate метода ListFragment, используемого активностью A. (Я еще не тестировал этот подход)


Какое из этих решений лучше? Или есть ли другое (гораздо более лучшее) решение?

Решение a) довольно прост и прямолинейно, но b), вероятно, лучше, потому что используется стандартная реализация up caret.

Любые идеи приветствуются. Спасибо.

4b9b3361

Ответ 1

Решение c является правильным вариантом. Во-первых, однако, объяснение проблемы с решением а.

Нет абсолютно никакого смысла иметь две кнопки в вашей деятельности. Кроме того, опция a фактически разрывает кнопку "вверх" . Пункт кнопки "вверх" - предоставить пользователям возможность оставаться в вашем приложении, когда они приземлились в вашем приложении из внешнего источника. Например, если вы приземляетесь на активность B из внешней активности C, и если вы используете свой вариант a, то нажатие "вверх" в действии B приведет к отображению активности C. Поведение, которое вы хотели бы, было бы для отображения активности A.

Как вы можете видеть, решение b находится на правильном пути. Вы определенно хотите перейти к A и не вернуться к C. Однако просто сохранение состояния в onSaveInstanceState не приведет к сохранению состояния. Это связано с тем, что onSaveInstanceState вызывается только в том случае, если ваше приложение может быть убито системой. Не гарантируется, что вы будете называться, если ваше приложение было уничтожено вручную, и оно, конечно же, не будет вызываться, когда будет создан новый экземпляр вашей деятельности. Если намерение начинает новую активность, то оно не будет восстанавливать свое состояние из другой активности.

Таким образом, решение состоит в том, что вы должны написать что-либо постоянное для файла общих предпочтений (или настраиваемой постоянной). При этом вы можете гарантировать, что все экземпляры Activity совместно используют одно и то же состояние в нескольких задачах, если вызывается их onResume (или везде, где вы восстанавливаете состояние). ИЛИ:

Если вы точно знаете, как вы хотите, чтобы ваша навигация работала, вы можете не записывать все в постоянное состояние, используя комбинацию флажков Intent и аффинности Activity task. Если вы хотите использовать ту же самую активность, даже если вы переходите в приложение из внешнего источника, вы можете оставить привязку к своей активности по умолчанию (связанной с приложением) и использовать что-то вроде Intent.FLAG_ACTIVITY_CLEAR_TOP.

Лично я сначала попытался использовать флаг Intent и не смог вернуться к написанию состояния настойчиво. Вы просто не хотите, чтобы место прокрутки сидело на постоянной памяти, если вы можете избежать этого.