我在android中使用NavHost应用程序的SingleActivity时遇到了一些问题。在一个片段中有一些来自EditText小部件的文本字符串,我需要将其放入ViewModel中,并用新的ViewModel数据更新其他片段。我在NavHost实现之外的浮动操作按钮的OnClick方法中的MainActivity中执行此操作。
所以,我试过
FragmentManager fm = getSupportFragmentManager();
CreateFragment fragment = (CreateFragment) fm.findFragmentById(R.id.fragment_create);
fragment.saveInputFromTextFields();
但是这里findFragmentById返回null,我不知道为什么。
我有一个以前问过的问题的解决方案,我在MainActivity中使用它来查找当前显示的片段,并从中调用一个方法;
Fragment navHostFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
if (navHostFragment instanceof NavHostFragment) {
Fragment visibleFragment = navHostFragment.getChildFragmentManager().getFragments().get(0);
if (visibleFragment instanceof HomeFragment) {
((HomeFragment) visibleFragment).saveInputFromTextFields();
}
}
但这在一次使用后不起作用,因为navHostFragment.getChildFragmentManager().getFragments().get(0);
总是返回前一个片段,并且将get(0)
更改为get(1)
会使应用程序与IndexOutOfBoundsException
一起崩溃。
也许我做这件事的方式不对。
我真正需要的是在一个片段中设置ViewModel数据并用新数据更新其他片段的可靠方法。我听说过一种叫做LiveData或DataBinding的东西,我需要实现这样的东西吗?这感觉太夸张了。我正在处理的数据是ViewModel中的一个数组列表,其中包含填充回收器视图的项目。我使用这些片段来创建新项目或编辑当前项目,我只需要以某种方式访问这些项目。我觉得有一种更简单的方法,但我不知道如何实现。如果你需要我提供更多信息,请告诉我。
谢谢你抽出时间。
导航组件主要用于在顶级目的地之间导航。因此,NavHostFragment
有一个当前在任何时候都处于活动状态的目标,这就解释了为什么您只能从其片段管理器中检索当前片段。
如果你想在片段之间共享数据,我会考虑使用作用域为你的活动的ViewModel
,这样你的两个片段都可以保存引用。这里有一些入门文档:在片段之间共享数据。还有一个codelab,它可以让你提前了解共享视图模型,但也可以使用LiveData
,我肯定会推荐它:跨碎片的共享视图模型codelab。
我意识到我做这件事的方式不对。我需要更新的数据可以在碎片被销毁和创建时更新。因此,我真的没有必要告诉片段的实例手动更新数据,因为这可以由android处理。
感谢大家的回复。