哪一个使用NavUtils.navigateUpFromSameTask()与onBackPressed()

时间:2013-09-19 22:42:18

标签: android

我有两个活动A和B.A有一个使用LoaderManager的ListFragment,而B活动显示有关在A的ListFragment中选择的项目的详细信息。我刚刚注意到,当我使用后退按钮从B返回到A时,ListFragment中的位置保留,但是当我在操作栏中使用向上按钮(左点插入符号)时,A活动重新创建,因此列表视图中的位置将丢失。

我想解决这个问题,但我不确定如何做到这一点的最好方法。

我想出了这个解决方案:

a)使用onBackPressed()

替换B活动中android.R.id.home(向上操作栏按钮)的默认实现,而不是NavUtils.navigateUpFromSameTask(this)函数调用onBackPressed()活动方法。我已经对它进行了测试,但它确实有效。

b)继续使用NavUtils.navigateUpFromSameTask(this)

但是在A活动使用的ListFragment的onSaveInstanceState方法中实现onCreate并恢复listView位置。 (我还没有测试过这种方法)


哪种解决方案更好?或者还有其他(更好的)解决方案吗?

解决方案 a)非常简单直接,但 b)可能更好,因为使用了上插入符号的默认实现

欢迎任何想法。感谢。

2 个答案:

答案 0 :(得分:9)

解决方案 c 是正确的选项。首先,解释解决方案 a 的问题。

在您的活动中有两个后退按钮绝对没有意义。此外,选项 a 实际上打破了向上按钮。向上按钮的目的是为用户提供一种方式,让他们在从外部来源登陆您的应用时留在您的应用中。例如,如果您从外部活动C登陆活动B,并且如果您使用选项 a ,则在活动B中按“向上”将导致显示活动C.您想要的行为是显示活动A.

如您所见,解决方案 b 处于正确的轨道上。你肯定希望向上到A而不是回到到C.但是,只需将状态存储在onSaveInstanceState中就不会导致状态被保留。这是因为如果您的应用程序可能被系统杀死,则onSaveInstanceState仅被调用。如果您的应用程序是手动销毁的,则无法保证调用它,并且在创建Activity的新实例时肯定不会调用它。如果Intent启动一个新活动,那么它将不会从其他活动恢复其状态。

然后,解决方案是,您必须将任何持久性写入共享首选项文件(或自定义持久性备用文件)。执行此操作时,您可以保证活动的所有实例在多个任务中共享相同的状态,只要它们的onResume(或您恢复状态的任何位置)被称为。 OR:

如果您确切知道导航的工作方式,则可以通过使用Intent标志和Activity任务关联性的组合来避免将所有内容写入持久状态。如果您想要使用相同的活动,即使您从外部源导航到应用程序,那么您可以将活动A的亲和力保留为默认值(链接到应用程序)并使用类似Intent.FLAG_ACTIVITY_CLEAR_TOP的内容。

就个人而言,我首先尝试Intent标志方法,然后再回到继续写入状态。如果你能避免它,你真的不希望滚动位置坐在持久存储上。

答案 1 :(得分:0)

查看此演示文稿:https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android。它解决了你所有的问题。