如何解决Android中的ViewModel LiveData无法正常工作
我刚刚了解了liveata视图模型。我有一个对象,main_activity由2个片段组成,其中当我更改ControlFragment的值时,DetailFragment上的值将更改。但是它不起作用,虽然我更改了片段控制中的值,但片段2中的值没有改变。
请帮我解决问题
ViewModelMedal
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);
}
}
ControlFragment.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;
}
}
}
DetailFragment
public class DetailFragment extends Fragment {
public ViewModelMedal mViewModelMedal;
private TextView tvGold,tvBronze;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_detail,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;
}
解决方法
问题在这里非常简单:您有ViewModelMedal
类的两个实例,因为您在ViewModelStoreOwner
调用中将两个片段用作ViewModelProviders.of(this)
。可能会帮助您使用父级Activity
通过调用ViewModelProviders.of(requireActivity())
来管理视图模型。
请注意,ViewModelProviders
类已被弃用,如其页面上的消息所述:
不推荐使用此类。
直接使用
ViewModelProvider
的构造函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。