Android导航组件在弹出Backback时执行操作
我正在使用android导航组件,尽管早期有一些问题,但它现在运行良好 我坚持“一个活动多个片段”的设计原则,并使用共享视图模型在片段之间进行通信 我现在在我的应用程序中有一个场景,用户创建一些东西,保存它,然后返回到主列表片段(想想添加一个新联系人,除了它涉及的远不止在一些框中键入之外)Android导航组件在弹出Backback时执行操作,android,back-button,android-jetpack,android-viewmodel,android-architecture-navigation,Android,Back Button,Android Jetpack,Android Viewmodel,Android Architecture Navigation,我正在使用android导航组件,尽管早期有一些问题,但它现在运行良好 我坚持“一个活动多个片段”的设计原则,并使用共享视图模型在片段之间进行通信 我现在在我的应用程序中有一个场景,用户创建一些东西,保存它,然后返回到主列表片段(想想添加一个新联系人,除了它涉及的远不止在一些框中键入之外) 当用户保存从我的视图模型中清除数据所需的信息时(这是由于安全问题而非性能),因为它们是共享视图模型,因此与活动生命周期而非片段相关,因此它们不会自行清除,我可以在正常流程中实现这一点,只需将数据设置为null
当用户保存从我的视图模型中清除数据所需的信息时(这是由于安全问题而非性能),因为它们是共享视图模型,因此与活动生命周期而非片段相关,因此它们不会自行清除,我可以在正常流程中实现这一点,只需将数据设置为null并调用navcontroller.popBackStack(),但如果用户自己按下按钮,我无法知道,因此无法清除这些视图模型,有什么想法吗?您可以实现一个侦听器界面(例如OnBackPressedListener)并在您各自的片段中使用它在按下后退按钮(或向上导航)时采取行动。界面将是您的片段和活动之间的桥梁。正确的方法我认为在当时不可用,但您应该将视图模型的范围限定在导航图上,这样系统将清除数据,您只处理导航,快速示例:
private ViewModelStoreOwner getStoreOwner() {
NavController navController = Navigation
.findNavController(requireActivity(), R.id.root_navigator_fragment);
return navController.getViewModelStoreOwner(R.id.root_navigator);
}
private void setUpSearchViewModel() {
searchViewModel = new ViewModelProvider(getStoreOwner()).get(SearchViewModel.class);
}
也许您可以实现一个监听器界面(比如OnBackPressedListener),并在您各自的片段中使用它来在按下后退按钮(或向上导航)时执行操作。接口将是您的片段和活动之间的桥梁。我不喜欢它哈哈,但它肯定回答了这个问题,所以谢谢你,如果你加上这个作为答案,我会接受它刚刚做的。非常感谢。我不喜欢这样做的原因是,要这样做,我需要知道显示了哪个片段,如果它实现了接口,这可以通过获取navHost来实现,但我有很多navHosts,因此可能会实现一个视图模型,该模型存储了当前的nav host,它将吸入我的opinion@martinseal1987如果你还有这个问题,在最新版本中,我们现在有了一个OnNavigateUpListener。哇,这将是一个很大的帮助谢谢你指出这一点,我实际上只是把一个视图模型绑定到活动上,只是为了完成昨天的任务。我碰巧在我的一个项目中遇到了同样的问题,昨天我玩了这个监听器界面。我发现这实际上是用于另一个问题(嵌套navhosts)。所以我决定自己使用一个自定义接口:)但请随意尝试,希望您能使它适用于您的案例。我的场景是嵌套nav主机