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

Android向上导航,用于具有多个父项的活动,android,android-actionbar,Android,Android Actionbar,我在使用此导航树的应用程序上执行向上导航时遇到问题: 后退按钮的标准实现很好 当尝试执行“向上”按钮时,问题开始出现 我所期望的是: 当用户打开详细信息5活动并按下向上按钮时,应用程序进入列表3活动 当用户打开“详细信息7活动”并按下“向上”按钮时,应用程序将返回到“主页活动” 因此,从不同的角度来看,我希望在后堆栈中有这样的行为: Android文档()建议使用以下代码处理向上导航: Intent parentActivityIntent = new Intent(this, MyPa

我在使用此导航树的应用程序上执行向上导航时遇到问题:

后退按钮的标准实现很好

当尝试执行“向上”按钮时,问题开始出现

我所期望的是:

  • 当用户打开详细信息5活动并按下向上按钮时,应用程序进入列表3活动
  • 当用户打开“详细信息7活动”并按下“向上”按钮时,应用程序将返回到“主页活动”
因此,从不同的角度来看,我希望在后堆栈中有这样的行为:

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

Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
但是由于详细信息活动的父活动在不同的导航路径上不同,我不知道它到底是哪一个。所以我不能称之为意图

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


如果没有,有没有办法在这个应用程序中实现正确的向上导航?

这是一个棘手的问题,在我看来,这确实说明了在应对Android的用户体验决策时遇到的困难。因此,你的问题没有一个明确的答案

我有两种可能的解决办法

1。模仿后退按钮的行为。

你可以考虑添加一个额外的意图来从一个不同的父母发起细节。当按下

android.R.id.home
时,此额外信息将通知这些活动需要启动哪些活动

这实际上意味着你的应用程序“回到”它的共同祖先,而不是简单地重新启动Home

实现这一点的另一种方法可能是简单地执行
onBackPressed()
,而不是带着
意图启动Home.FLAG\u ACTIVITY\u CLEAR\u TOP
,但请记住,相关的动画将不同于正常的“up”动作

2。跳过中间活动,回家。


一些应用程序将“向上按钮”视为“主页按钮”。你可能想考虑让它总是重启“<代码>意图”。 其思想是遍历最后一个
活动的堆栈。例如:

public static Stack<Class<?>> parents = new Stack<Class<?>>();
当您想返回到父级
活动时,可以使用以下选项(根据您的代码):


我希望我是对的(:

这肯定是一篇老文章,但当我研究SharedReferences时,我认为有可能将此信息堆叠在SharedReferences数据中,并在每次访问2个家长之前修改其值。
然后通过阅读它,你应该能够直接了解你的父母,而不必为此构建一个完整的类。

我从未实现过这个,甚至没有使用过这个,但应用程序将有多个路径中的一个,他知道哪些是候选父母。难道他不能将Home按钮作为一个特殊的backbackbackback来处理,其中包含他的“家长”活动。代码方面:他可以保持一个启动的家长活动堆栈,并在按下home键时弹出该堆栈@SherifelKhatib无法从应用程序查询backbackback,因此我担心这种方法不起作用。我认为这没什么大不了的,因为如果某个活动知道它是如何启动的,它可以相应地运行。感谢您的回答,back实现是我的第一个实现,它的行为与我想要的不完全一样。请输入额外的t他父母的做法有点棘手,所以我实施了@Sherif elKhatib解决方案。回家按钮不是我想要的行为,但它可以成为解决问题的有用方法;-)我已经成功地实现了您的解决方案。它工作得很好。谢谢!我必须将启动意图的额外部分添加到堆栈中,以使用正确的额外意图还原父活动,但这只是一个实现细节。恭喜,这不是一个“脏”的解决方案。它实际上是好的。是的,它不是真正的“脏”,它工作良好,易于单元测试。这是一个非常聪明的解决方案。为这项工作选择了正确的数据结构也值得称赞!请注意,这与Android导航模式不符,但正如OP所述。为什么它与Android导航模式不符?我试图完全按照它应该做的去实现它。我错在哪里?
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
}
Intent parentActivityIntent = new Intent(this, parents.pop());
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();