[英]ViewModel LiveData in android not working
我剛剛了解了 liveata 視圖模型。 我有一個對象,main_activity 由 2 個片段組成,其中當我更改 ControlFragment 的值時,DetailFragment 上的值將更改。 但它不起作用,當我更改片段控件中的值時,片段 2 中的值不會更改。
請幫我解決問題
視圖模型獎章
public class ViewModelMedal extends ViewModel {
public MutableLiveData<Integer> numberGold = new MutableLiveData<>();
public MutableLiveData<Integer> numberSilver = new MutableLiveData<>();
public MutableLiveData<Integer> numberBronze = new MutableLiveData<>();
public ViewModelMedal() {
numberGold.setValue(0);
numberSilver.setValue(0);
numberBronze.setValue(0);
}
}
控制片段.java
public class ControlFragmentJava extends Fragment implements View.OnClickListener {
private Button btnGold, btnGoldPlus, btnSilver, btnSilverPlus, btnCu, btnCuPlus;
private TextView tvGold, tvSilver, tvBronze;
private ViewModelMedal mViewModelMedal;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_control, container, false);
mViewModelMedal = ViewModelProviders.of(this).get(ViewModelMedal.class);
.
.
.
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnBronzePlus:
mViewModelMedal.numberCBronze.setValue(mViewModelMedal.numberCu.getValue()+1);
initSetData();
break;
case R.id.btnBronzeMinus:
mViewModelMedal.numberBronze.setValue(mViewModelMedal.numberCu.getValue()-1);
initSetData();
break;
case R.id.btnGoldMinus:
mViewModelMedal.numberGold.setValue(mViewModelMedal.numberGold.getValue()-1);
initSetData();
break;
case R.id.btnGoldPlus:
mViewModelMedal.numberGold.setValue(mViewModelMedal.numberGold.getValue()+1);
initSetData();
break;
case R.id.btnSilverMinus:
mViewModelMedal.numberSilver.setValue(mViewModelMedal.numberSilver.getValue()-1);
initSetData();
break;
case R.id.btnSilverPlus:
mViewModelMedal.numberSilver.setValue(mViewModelMedal.numberSilver.getValue()+1);
initSetData();
break;
}
}
}
細節片段
public class DetailFragment extends Fragment {
public ViewModelMedal mViewModelMedal;
private TextView tvGold, tvSilver, tvBronze;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_detail,container,false);
tvBronze = view.findViewById(R.id.tvDetailBronzeNumber);
tvGold = view.findViewById(R.id.tvDetailGoldNumber);
tvSilver = view.findViewById(R.id.tvDetailSilverNumber);
mViewModelMedal = ViewModelProviders.of(this).get(ViewModelMedal.class);
mViewModelMedal.numberBronze.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
tvCu.setText(String.valueOf(mViewModelMedal.numberCu.getValue()));
}
});
mViewModelMedal.numberGold.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
tvGold.setText(String.valueOf(mViewModelMedal.numberGold.getValue()));
}
});
mViewModelMedal.numberSilver.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
tvSilver.setText(String.valueOf(mViewModelMedal.numberSilver.getValue()));
}
});
return view;
}
這里的問題非常簡單:當您在ViewModelProviders.of(this)
調用中使用兩個片段作為ViewModelStoreOwner
,您有兩個ViewModelMedal
類的實例。 通過調用ViewModelProviders.of(requireActivity())
來使用父Activity
來管理視圖模型可能對您有所幫助。
請注意,如其頁面上的消息所述,不推薦使用ViewModelProviders
類:
該類已棄用。
直接使用
ViewModelProvider
的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.