Android 如何在两个不同的片段中使用相同的数据

Android 如何在两个不同的片段中使用相同的数据,android,android-fragments,Android,Android Fragments,我想在两个不同的片段中使用从API响应接收的数据 现在我有一个活动和两个片段 当应用程序启动时,第一个片段中有API调用。然后显示API响应的结果。另外,我想在第二个片段中使用相同的结果。我要使用的数据存储在列表中 所以,我的问题是:我必须在第一个片段中发出请求,并以某种方式将数据传递给第二个片段,还是有一种方法可以在片段外部发出请求,strore result,然后从两个片段中使用此结果?如果您使用MVVM体系结构模式编写应用程序,我认为您可以使用共享视图模型 一个活动中的两个或多个片段需

我想在两个不同的片段中使用从API响应接收的数据

现在我有一个活动和两个片段

当应用程序启动时,第一个片段中有API调用。然后显示API响应的结果。另外,我想在第二个片段中使用相同的结果。我要使用的数据存储在列表中


所以,我的问题是:我必须在第一个片段中发出请求,并以某种方式将数据传递给第二个片段,还是有一种方法可以在片段外部发出请求,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
}