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

Tom*_*och 18 android

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

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

我想出了这个解决方案:

a)使用 onBackPressed()

替换android.R.id.homeB活动中(向上操作栏按钮)的默认实现,而不是NavUtils.navigateUpFromSameTask(this)函数调用onBackPressed()activity方法.我测试了它,它的工作原理.

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

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


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

解决方案a)非常简单直接,但b)可能更好,因为使用了up caret 的默认实现.

欢迎任何想法.谢谢.

dco*_*cow 9

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

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

如您所见,解决方案b在正确的轨道上.你肯定想要升级到A而不是回到 C.然而,简单地存储状态onSaveInstanceState将不会导致状态被保留.这是因为onSaveInstanceState只有在您的应用程序被系统杀死时才会被调用.如果您的应用程序是手动销毁的,则无法保证调用它,并且在创建Activity的新实例时肯定不会调用它.如果Intent启动一个新活动,那么它将不会从其他活动恢复其状态.

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

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

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

  • 我使用了FLAG_ACTIVITY_CLEAR_TOP选项并将`NavUtils.navigateUpFromSameTask(this);`替换为:`Intent intent = NavUtils.getParentActivityIntent(this);``intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);``NavUtils.navigateUpTo(这个,意图);`它很棒!谢谢. (12认同)