在一个片段中设置ViewModel,并使用NavHost在SingleActivity应用程序中的其他片段中获取新数据



我在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处理。

感谢大家的回复。

相关内容

  • 没有找到相关文章

最新更新