gpt4 book ai didi

Android MVP - 如何在 Activity 演示者和 fragment 演示者之间进行通信

转载 作者:IT老高 更新时间:2023-10-28 22:18:46 26 4
gpt4 key购买 nike

我有一个包含 3 个 fragment 的 Activity ,目前我使用 ViewPager。我想实现 MVP 并在 Activity 演示者和 fragment 演示者之间进行通信,即:

  • 将数据从 Activity 展示器传递到 fragment 展示器
  • 从 fragment 展示者向 Activity 展示者发送事件
  • ...

但我不知道如何以官方方式进行。我可以使用 BusEvent,但我认为这不是一个好习惯。

最佳答案

fragment 和 Activity 之间的通信,反之亦然,可以使用 nnn's answer 来完成。或者您可以使用 ViewModelLiveData 巫婆提供更清洁的方式并尊重 fragmentsactivities 的生命周期,这可以省去编写几行代码,以防止不可见的 fragment 在后台接收数据。

首先你扩展ViewModel类,初始化Livedata和一些辅助方法。

public class MyViewModel extends ViewModel {
private MutableLiveData<String> toFragmentA, toFragmentB;
private MutableLiveData<List<String>> toAllFragments;

public MyViewModel() {
toFragmentA = new MutableLiveData<>();
toFragmentB = new MutableLiveData<>();
toAllFragments = new MutableLiveData<>();
}

public void changeFragmentAData(String value){
toFragmentA.postValue(value);
}
public void changeFragmentBData(String value){
toFragmentB.postValue(value);
}
public void changeFragmentAllData(List<String> value){
toAllFragments.postValue(value);
}

public LiveData<String> getToFragmentA() {
return toFragmentA;
}

public LiveData<List<String>> getToAllFragments() {
return toAllFragments;
}

public LiveData<String> getToFragmentB() {
return toFragmentB;
}

}

然后你在你的 Activity 上初始化 ViewModel

public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabLayout tabLayout;
MyViewModel mViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mViewModel = ViewModelProviders.of(this)
.get(MyViewModel.class);

viewPager.setAdapter(new Adapter(getSupportFragmentManager()));


}

}

读取 fragment 中的数据:

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);

mViewModel.getToAllFragments().observe(this, new Observer<List<String>>() {
@Override
public void onChanged(List<String> s) {
myList.addAll(s);
//do something like update a RecyclerView
}
});

mViewModel.getToFragmentA().observe(this, new Observer<String>() {


@Override
public void onChanged(String s) {
mytext = s;
//do something like update a TextView
}
});
}

要更改任何实时数据的值,您可以使用任何 fragment 或 Activity 中的方法之一:

changeFragmentAData();
changeFragmentBData();
changeFragmentAllData();

幕后发生了什么:

当您使用 mViewModel = ViewModelProviders.of(this).get(MyViewModel.class) 时,您正在创建一个 ViewModel 实例并将其绑定(bind)到给定 fragment 的 Activity ,因此 View 模型仅在 activityfragment 停止时被破坏。如果您使用 mViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class)如果父项activity`

,则将其绑定(bind)到生命周期

当您使用 mViewModel.getToFragmentA().observe()mViewModel.getToFragmentB().observe()mViewModel.getToAllFragments().observe () 您正在将 MyViewModel 类中的 LiveData 连接到给定的 fragment 或 Activity 以及 onChange() 方法的值在所有观察该方法的类中更新。

我建议个人经验对 Livedata end ViewModel 进行一些研究,您可以在 youtubethis link

关于Android MVP - 如何在 Activity 演示者和 fragment 演示者之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36707753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com