用于具有多个父级的活动的Android向上导航

时间:2013-02-01 20:22:10

标签: android android-actionbar

我在使用此导航树在应用上实施向上导航时遇到问题:

App navigation tree

后退按钮的标准实现很好。

尝试实施“向上”按钮时,问题就开始了。

我的期望:

  • 当用户在详细信息5活动时,按下向上按钮,应用转到列表3活动
  • 当用户使用详细信息7活动并按向上按钮时,该应用将返回主页活动

所以从不同的角度来说,我希望在后台堆栈上有这种行为:

app backstack clear

Android文档(Implementing Ancestral Navigation)建议使用以下代码处理向上导航

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

但由于详情活动的父活动在不同的导航路径上有所不同,我不知道它究竟是哪一个。所以我不能在Intent中调用它。

有没有办法知道Android后台堆栈中真正的父活动?

如果没有,有没有办法在此应用中实施正确的向上导航

3 个答案:

答案 0 :(得分:22)

我会坚持我对保罗答案的评论:

想法是遍历最后Parent个活动的堆栈。例如:

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

现在,在您的所有父活动(在您的案例中被视为父母的活动 - 例如:列表和主页)中,您将其添加到他们的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();

我希望是对的(:

答案 1 :(得分:2)

这是一个棘手的问题,在我看来,真正显示出在处理“向上按钮”Android的用户体验决策时遇到的困难。因此,对您的问题没有明确的答案。

我有两种可能的解决方案。

<强> 1。模仿后退按钮的行为。

您可以考虑在其各个父母之一中添加额外的意图来启动详细信息。此额外信息将告知那些活动在按下android.R.id.home时需要启动哪些活动。

这实际上意味着您的应用“回归”其共同的祖先,而不是简单地重新启动 Home

实现此功能的另一种方法可能是执行onBackPressed()而不是使用Intent.FLAG_ACTIVITY_CLEAR_TOP启动 Home ,但要记住关联的动画与普通动画不同“ “行动。

<强> 2。跳过中间活动并回家。

有些应用将“向上按钮”视为“主页按钮”。您可能需要考虑让它始终使用Intent.FLAG_ACTIVITY_CLEAR_TOP重新启动 Home

答案 2 :(得分:0)

这肯定是一个老帖子,但是当我研究SharedPreferences时,我认为可以将这些信息堆叠在sharedPreferences数据中,并且每次在关闭2个父项之前修改其值。 然后通过阅读它,你应该能够直接了解你的父母,而不必为此建立一个完整的类。