簡體   English   中英

android中的ViewModel LiveData不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM