Activity和3个Fragment同时绑定一个数据源LiveData,点击更新按钮,同时更新这四处。
1、Fragment
BaseFragment
abstract public class BaseFragment extends Fragment {
private MyViewModel myViewModel;
protected TextView tvShowData;
protected String initParam;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//绑定TextView
bindTextView();
//设置初始化显示数据
if (tvShowData != null) {
tvShowData.setText(initParam);
}
//获取 ViewModel 实例
myViewModel = new ViewModelProvider(getActivity(), new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
//观察数据变化
myViewModel.getLiveData().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(String s) {
if (tvShowData != null) {
tvShowData.setText(s);
}
}
});
}
abstract void bindTextView();
}
1) TopFragment
public class TopFragment extends BaseFragment {
/**
* 构造函数
*
* @param param
*/
public TopFragment(String param) {
initParam = param;
}
/**
* 绑定布局
*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frg_top, container, false);
}
/**
* 绑定控件
*/
@Override
void bindTextView() {
tvShowData = getActivity().findViewById(R.id.id_tv_show_data_top);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_tv_show_data_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="result"
android:textColor="@color/white"
android:textSize="30dp" />
</LinearLayout>
2) MidFragment
public class MidFragment extends BaseFragment {
/**
* 构造函数
*
* @param param
*/
public MidFragment(String param) {
initParam = param;
}
/**
* 绑定布局
*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frg_mid, container, false);
}
/**
* 绑定控件
*/
@Override
void bindTextView() {
tvShowData = getActivity().findViewById(R.id.id_tv_show_data_mid);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_tv_show_data_mid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="result"
android:textColor="@color/white"
android:textSize="30dp" />
</LinearLayout>
3) BomFragment
public class BomFragment extends BaseFragment {
/**
* 构造函数
*
* @param param
*/
public BomFragment(String param) {
initParam = param;
}
/**
* 绑定布局
*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frg_bom, container, false);
}
/**
* 绑定控件
*/
@Override
void bindTextView() {
tvShowData = getActivity().findViewById(R.id.id_tv_show_data_bom);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_tv_show_data_bom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center_horizontal"
android:text="result"
android:textColor="@color/white"
android:textSize="30dp" />
</LinearLayout>
2、数据处理
DataManager
/**
* @date 2021/06/30
* @description 数据处理层
*/
public class DataManager {
/**
* 模拟从服务器获取数据
*
* @return 从服务器获取的数据
*/
public static String getDataFromSever() {
int data = new Random().nextInt(100);
return Integer.toBinaryString(data);
}
}
ViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<String> liveData;
/**
* 构造函数
*/
public MyViewModel() {
liveData = new MutableLiveData<>();
}
/**
* 获取 LiveData
*
* @return liveData
*/
public MutableLiveData<String> getLiveData() {
return liveData;
}
/**
* 更新数据
*/
public void updateData() {
new Thread(new Runnable() {
@Override
public void run() {
liveData.postValue(DataManager.getDataFromSever());
}
}).start();
}
}
3、Activity
public class FrgActivity extends BaseActivity {
@BindView(R.id.id_update_data)
TextView btnUpdateData;
@BindView(R.id.id_tv_show_data_act)
TextView tvShowData;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private TopFragment topFragment;
private MidFragment midFragment;
private BomFragment bomFragment;
private MyViewModel myViewModel;
@Override
protected void init() {
//初始化fragment
initFragment();
//初始化界面
initView();
}
/**
* 初始化fragment
*/
private void initFragment() {
fragmentManager = getSupportFragmentManager();
topFragment = new TopFragment("top frg");
midFragment = new MidFragment("mid frg");
bomFragment = new BomFragment("bom frg");
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.id_frg_top, topFragment);
fragmentTransaction.add(R.id.id_frg_mid, midFragment);
fragmentTransaction.add(R.id.id_frg_bom, bomFragment);
fragmentTransaction.commit();
}
/**
* 初始化界面按钮
*/
private void initView() {
//获取 ViewModel 实例
myViewModel = new ViewModelProvider(getActivity(), new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
//观察数据变化
myViewModel.getLiveData().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(String s) {
tvShowData.setText(s);
}
});
//按钮点击
btnUpdateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.updateData();
}
});
}
@Override
protected int getLayoutId() {
return R.layout.act_frg;
}
@Override
protected String getActivityName() {
return "FrgActivity";
}
}