Android 如何在两个不同的片段中使用相同的数据
我想在两个不同的片段中使用从API响应接收的数据 现在我有一个活动和两个片段 当应用程序启动时,第一个片段中有API调用。然后显示API响应的结果。另外,我想在第二个片段中使用相同的结果。我要使用的数据存储在列表中Android 如何在两个不同的片段中使用相同的数据,android,android-fragments,Android,Android Fragments,我想在两个不同的片段中使用从API响应接收的数据 现在我有一个活动和两个片段 当应用程序启动时,第一个片段中有API调用。然后显示API响应的结果。另外,我想在第二个片段中使用相同的结果。我要使用的数据存储在列表中 所以,我的问题是:我必须在第一个片段中发出请求,并以某种方式将数据传递给第二个片段,还是有一种方法可以在片段外部发出请求,strore result,然后从两个片段中使用此结果?如果您使用MVVM体系结构模式编写应用程序,我认为您可以使用共享视图模型 一个活动中的两个或多个片段需
所以,我的问题是:我必须在第一个片段中发出请求,并以某种方式将数据传递给第二个片段,还是有一种方法可以在片段外部发出请求,strore result,然后从两个片段中使用此结果?如果您使用MVVM体系结构模式编写应用程序,我认为您可以使用
共享视图模型
一个活动中的两个或多个片段需要相互通信是很常见的。想象一下主细节片段的常见情况,其中有一个片段,用户从列表中选择一个项目,另一个片段显示所选项目的内容
公共类SharedViewModel扩展了ViewModel{
private final MutableLiveData selected=新的MutableLiveData();
公共作废选择(项目){
已选择。设置值(项目);
}
公共LiveData getSelected(){
返回选中的;
}
}
公共类主片段扩展片段{
私有共享模型;
已创建公用void onview(@NonNull视图,Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
model=newviewmodelprovider(requirectivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(项->{
型号。选择(项目);
});
}
}
公共类DetailFragment扩展了片段{
已创建公用void onview(@NonNull视图,Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
SharedViewModel model=newviewmodelprovider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(),{item->
//更新用户界面。
});
}
}
也许我可以解释一下。您必须创建一个扩展FragmentStateAdapter的类,然后您应该创建一个扩展Fragment的类,而不是创建多个类和一个布局
创建ClassFragmentPagerAdapter,如下所示:
public class ClassFragmentPagerAdapter extends FragmentStateAdapter {
public ClassFragmentPagerAdapter (@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new ClassFragment ();
}
return new ClassFragment ();
}
@Override
public int getItemCount() {
return 2;
}
然后,创建另一个扩展片段的类片段:
public class ClassFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.layout_name, container, false);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//do stuff here
}
希望有帮助!快乐编码:)有几种方法可以做到这一点
解决问题的最简单方法是使用单例出于许多原因,我强烈反对这个想法,但大多数情况下,这是启动并运行它的最快方法
另一种解决方案是将数据存储在活动的成员中,并通过(活动名为MyActivity)访问该数据。myData
您可以在活动中发出请求,然后以bundleEasy的方式将响应传递给两个片段:再次发出请求。您的问题:您可以将数据存储在共享首选项中,或者在从API获取数据时使用某种缓存策略。始终欢迎指向潜在解决方案的链接,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。有关更多信息,请检查这是一个很好的答案,即使它只是链接。MVVM指的是一个特定的体系结构,因此此链接中没有适用的代码。使用MVVM体系结构也是我的建议,因为这是更干净的方法谢谢你的回答。以前我写的应用程序没有任何架构模式。我使用JAVA。现在我正在尝试使用MVVM重构它。我已经创建了SharedViewModel。但在解决我最初的问题时,我偶然发现了另一个问题:如果不同片段中的数据不相互依赖,我如何重用它们?您提供的链接表示“一个活动中的两个或多个片段需要相互通信是很常见的”,但我的情况并非如此。我希望在不同的片段中使用相同的数据,而不在片段之间切换时向API发出新的请求。但是,如果两个片段中的ViewModel相同,则可以在两个片段上使用相同的数据。因此,如果在片段上加载数据,则将其加载到SharedViewModel类中的变量。然后您可以通过SharedViewModel使用片段B中的相同变量。因此,在代码中,我粘贴到DetailFragment
中回答问题,而不是观察LiveData,您可以从model.getSelected()
中获取值并使用它。非常感谢!我已经用所有API调用创建了存储库。然后,我用一个方法getForecast()
创建了SharedViewModel,从存储库中检索数据。现在,在这两个片段中,我使用model=newviewmodelprovider(requireActivity()).get(SharedViewModel.class)
初始化模型,并在我使用model.getForecast()观察更改之后,使用getViewLifecycleOwner()观察模型,forecastData
。之后,我使用forecastData进行操作。我对您建议的理解是否正确?
public class ClassFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.layout_name, container, false);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//do stuff here
}