- Fragment的通信方式,網上搜了那么多方法,基本全都是使用介面回呼,如果是兩個Fragment需要即時傳資料,還需要先在Activity獲得f1傳過來的資料,再傳到f2,相當麻煩,
- 簡單方便的方法來自谷歌官方檔案:谷歌官方檔案,說明看官方檔案還是相當有用的,官方檔案也有Activity與Fragment間通信,一樣的方法,有需要自己去看,
谷歌檔案有個坑,關于ViewModelProviders棄用后最新用法:https://blog.csdn.net/weixin_43888181/article/details/109219671
1、創建SharedViewModel類,繼承ViewModel,在里面定義一個MutableLiveData型別的變數,Music是我們定義的一個類,用于傳遞,MutableLiveData檔案的解釋是:一個可變LiveData,而這個LiveData是一個生命周期資料存盤器類,可以遵循如 Activity、Fragment 或 Service的生命周期,定義了兩個public方法:setSelectMusic()和 getSelectMusic(),setSelectMusic()通過selectMusic.setValue()方法設定傳遞的引數, getSelectMusic()獲取到selectMusic,
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Music> selectMusic = new MutableLiveData<Music>();
public void setSelectMusic(Music music){
selectMusic.setValue(music);
}
public LiveData<Music> getSelectMusic() {
return selectMusic;
}
}
2、RightFragment.java中傳遞:
private SharedViewModel viewModel;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
viewModel = new ViewModelProvider(
requireActivity(),
new ViewModelProvider.NewInstanceFactory()).get(SharedViewModel.class);
Music music = new Music();
music.setName("陳奕迅 - 淘汰");
//傳遞引數
viewModel.setSelectMusic(music);
return view;
}
3、LeftFragment.java中接收:
private SharedViewModel viewModel;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(
requireActivity(),
new ViewModelProvider.NewInstanceFactory()).get(SharedViewModel.class);
viewModel.getSelectMusic().observe(this, item -> {
Log.d("RightFragment傳過來的資料 ", item.getName());
});
}

Music.java:
public class Music {
public String name; //音樂名
public String singer; //歌手
public long duration; //時長
public String url; //路徑
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290464.html
標籤:其他
