【问题标题】:Android up navigation for an Activity with multiple parents具有多个父项的 Activity 的 Android 向上导航
【发布时间】:2016-11-17 23:49:42
【问题描述】:

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

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

尝试实现向上按钮时问题开始。

我的期望:

  • 当用户在 Detail 5 Activity 上并按下向上按钮时,应用会转到 List 3 Activity
  • 当用户在 Detail 7 Activity 上并按下向上按钮时,应用会返回 Home Activity

所以在不同的方面,我希望在后台堆栈上具有这种行为:

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();

但是由于 Detail Activity 的父 Activity 在不同的导航路径上有所不同,我不知道它到底是哪一个。所以我不能在 Intent 中调用它。

有没有办法知道Android back stack中真正的父activity?

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

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

    我会坚持对 Paul 的回答发表评论:

    这个想法是遍历最后一个 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();
    

    我希望是对的(:

    【讨论】:

    • 我已成功实施您的解决方案。它工作正常。谢谢!我必须将初始意图的附加内容添加到堆栈中,以使用正确的附加意图恢复父 Activity,但这只是一个实现细节。
    • 恭喜,这并不是一个“肮脏”的解决方案。其实还好
    • 是的,它并不是真的“脏”,它工作正常,而且很容易进行单元测试。
    • 这是一个非常聪明的解决方案。为这项工作选择正确的数据结构也值得称赞!请注意,这与Android's navigation pattern 不对应,但它如OP所述。
    • 为什么-它对应Android导航模式?我试图完全按照它应该的方式实现它。我哪里错了?
    【解决方案2】:

    这是一个棘手的问题,在我看来,这确实表明了在 Android 的“向上按钮”方面做出 UX 决策时遇到的困难。因此,您的问题没有明确的答案。

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

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

    您可以考虑在意图中添加一个额外的内容,以从其不同的父项之一启动 Detail。当按下android.R.id.home 时,这个额外信息会通知这些活动他们需要启动哪些活动。

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

    实现这一点的另一种方法可能是简单地执行onBackPressed(),而不是使用Intent.FLAG_ACTIVITY_CLEAR_TOP 启动Home,但请记住,相关的动画将不同于正常的“向上”动作。

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

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

    【讨论】:

    • 我从来没有实现过这个,甚至没有使用过这个,但是应用程序将有多个路径之一,他知道哪些是候选父母。他不能将主页按钮作为包含他的“父母”活动的特殊后备箱来处理。代码方面:他可以保留启动的父活动堆栈,并在按下主页时弹出此堆栈。 (只是说)
    • @SherifelKhatib 无法从应用程序查询后台堆栈,所以我担心这种方法行不通。我认为这没什么大不了的,因为如果一个 Activity 知道它是如何启动的,它就可以做出相应的行为。
    • 感谢您的回答,后面的实现是我的第一个实现,它的行为与我想要的不完全一样。传递 Extra 父母有点棘手,所以我实施了@Sherif-elKhatib 解决方案。 go-home up 按钮不是我想要的行为,但它可能是解决问题的有用方法;-)
    【解决方案3】:

    这肯定是一篇旧帖子,但在我研究 SharedPreferences 时,我认为有可能将此信息堆叠在 sharedPreferences 数据中,并在每次下降 2 个父母之前修改其值。 然后通过阅读,您应该能够直接了解您的父母,而无需为此建立一个完整的班级。

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多