Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android导航组件在弹出Backback时执行操作_Android_Back Button_Android Jetpack_Android Viewmodel_Android Architecture Navigation - Fatal编程技术网

Android导航组件在弹出Backback时执行操作

Android导航组件在弹出Backback时执行操作,android,back-button,android-jetpack,android-viewmodel,android-architecture-navigation,Android,Back Button,Android Jetpack,Android Viewmodel,Android Architecture Navigation,我正在使用android导航组件,尽管早期有一些问题,但它现在运行良好 我坚持“一个活动多个片段”的设计原则,并使用共享视图模型在片段之间进行通信 我现在在我的应用程序中有一个场景,用户创建一些东西,保存它,然后返回到主列表片段(想想添加一个新联系人,除了它涉及的远不止在一些框中键入之外) 当用户保存从我的视图模型中清除数据所需的信息时(这是由于安全问题而非性能),因为它们是共享视图模型,因此与活动生命周期而非片段相关,因此它们不会自行清除,我可以在正常流程中实现这一点,只需将数据设置为null

我正在使用android导航组件,尽管早期有一些问题,但它现在运行良好

我坚持“一个活动多个片段”的设计原则,并使用共享视图模型在片段之间进行通信

我现在在我的应用程序中有一个场景,用户创建一些东西,保存它,然后返回到主列表片段(想想添加一个新联系人,除了它涉及的远不止在一些框中键入之外)


当用户保存从我的视图模型中清除数据所需的信息时(这是由于安全问题而非性能),因为它们是共享视图模型,因此与活动生命周期而非片段相关,因此它们不会自行清除,我可以在正常流程中实现这一点,只需将数据设置为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主机