【问题标题】:Bottom navigation behaves differently for starting destination底部导航对于起始目的地的行为不同
【发布时间】:2019-08-03 14:09:58
【问题描述】:

嘿,最近我在使用 NavController 进行设置时发现了这种奇怪的底部导航行为。

问题

只有底部导航的导航图中的起始目的地,保存其状态。而其他人则没有。[这意味着 onDestroy 永远不会仅用于起始目的地]。现在的问题是与起始目的地导航图关联的 ViewModel 永远不会被清除。

我正在寻找的行为

如何使起始目的地生命周期与所有其他目的地一样,以便在目的地更改时将清除视图模型?

代码sn-p:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_main"
            app:startDestination="@+id/nav_main_home">

    <include
            android:id="@+id/home_fragment_graph"
            app:graph = "@navigation/nav_main_home"/>

    <include
            android:id="@+id/profile_fragment_graph"
            app:graph = "@navigation/nav_main_profile"/>


    <include
            android:id="@+id/message_fragment_graph"
            app:graph = "@navigation/nav_main_message"/>


</navigation>

nav_main_home -nav_graph- for HomeFragment
nav_main_profile -nav_graph- for ProfileFragment
nav_main_message -nav_graph- for MessageFragment

现在,当我从 HomeFragment 切换到 ProfileFragment 或 MessageFragment 时,不会调用 HomeFragment 的 onDestroy。但是当我从 ProfileFragment 或 MessageFragment 切换时,它们都会调用 onDestroy。

【问题讨论】:

  • 一些代码可能会有所帮助。
  • 你是否被 NavController 所束缚?手动完成会更容易。

标签: android viewmodel bottomnavigationview android-jetpack-navigation


【解决方案1】:

片段(以及扩展导航)将片段的状态保存在后堆栈上。根据Principles of Navigation,图表的起始目的地应始终位于后堆栈上,这就是为什么当您从其他底部导航项之一回击时返回起始目的地以及它保持其状态的原因。你永远不应该故意丢弃用户的状态。

其他底部导航项不保持其状态的原因是,一旦您通过点击另一个底部导航项来关闭它们,它们就不再位于后堆栈中,因此碎片会破坏并丢弃与这些相关的任何状态片段。

现有的issue for supporting multiple back stacks 会导致每个底部导航项保存其状态并在您返回时恢复它。由于该问题尚未解决,有一个 NavigationAdvancedSample 提供了一种临时解决方法来解决该问题。

【讨论】:

  • 嗨,伊恩,感谢您提供的内部信息和参考资料。所以这意味着如果我需要清除视图模型,我应该在调用 onDestroyView 时手动执行?
  • 当用户点击后退按钮/旋转他们的设备时,Fragment 将恢复其 savedInstanceState(包括所有视图的状态)。您不应该为在后台堆栈上的片段清除 ViewModel。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多