[英]How to use same data in two different fragments
我想在两个不同的片段中使用从 API 响应中收到的数据。
现在我有一个活动和两个片段。
当应用程序启动时,第一个片段中有 API 调用。 然后我显示 API 响应的结果。 另外,我想在第二个片段中使用相同的结果。 我想使用的数据存储在列表中
所以,我的问题是:我是否必须在第一个片段中发出请求并以某种方式将数据传递给第二个片段,或者有一种方法可以在片段之外发出请求,存储结果,然后从两个片段中使用这个结果?
如果您以 MVVM 架构模式编写应用程序,我认为您可以使用Shared ViewModel
。
Android 文档。 在片段之间共享数据
Stack Overflow:使用 ViewModel 在片段之间共享数据
一个活动中的两个或多个片段需要相互通信是很常见的。 想象一个主从片段的常见情况,您有一个片段,其中用户从列表中选择一个项目,另一个片段显示所选项目的内容。
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
});
}
}
也许我可以解释一下。 您必须创建一个扩展 FragmentStateAdapter 的 class,然后您应该创建一个扩展 Fragment 的 class,而不是拥有多个类和一个布局。
像这样创建 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;
}
然后创建另一个扩展 Fragment 的 ClassFragment:
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
}
希望它有所帮助:快乐编码:)
go 关于这个有几种方法。
解决问题的最简单方法是使用 Singleton。 出于多种原因,我强烈反对这个想法,但大多数时候这是启动和运行它的最快方法。
另一种解决方案是将数据存储在活动的成员中,并通过(activity as MyActivity).myData
访问该成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.