簡體   English   中英

為什么不調用 LiveData 觀察器? (安卓,片段)

[英]Why LiveData observer is not called? (Android, Fragment)

即使 LiveData 值發生變化,我的觀察者也不會被調用。 我究竟做錯了什么?

觀察者和 model 在片段中初始化。 按鈕用於通過方法(計算后跟設置方法)更改 model 中的值。 但是,觀察者不會記錄 model 值的任何更改。

分段

public class PlayerFragment extends Fragment {

    private PlayerViewModel mViewModel;
    private ImageButton volumeUp, volumeDown;

    public static PlayerFragment newInstance() {
        return new PlayerFragment();
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
       
        volumeDown = getView().findViewById(R.id.btn_player_volume_down);
        volumeDown.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mViewModel.volumeDown();
            }
        });

        volumeUp = getView().findViewById(R.id.btn_player_volume_up);
        volumeUp.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mViewModel.volumeUp();
            }
        });

        final Observer<Integer> volumeObserver = new Observer<Integer>() {
            @Override
            public void onChanged(Integer volValue) {
                SeekBar volume = getView().findViewById(R.id.player_volumeBar);
                volume.setProgress( volValue );
            }
        };

        mViewModel.getVolume().observe(getViewLifecycleOwner(), volumeObserver);
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mViewModel = new ViewModelProvider(this).get(PlayerViewModel.class);
        return inflater.inflate(R.layout.fragment_player, container, false);
    }

    @Override
    public void onResume() {
        super.onResume();
        ((MainActivity) getActivity()).getSupportActionBar().setTitle( getString(R.string.fragment_player_title) );
        mViewModel.fetchPlayerData();
    }

}

視圖模型


public class PlayerViewModel extends ViewModel {

    private MutableLiveData<Integer> volume;

    public PlayerViewModel(){
        volume = new MutableLiveData<Integer>();
        fetchPlayerData();
    }

    public void fetchPlayerData(){
        volume = new MutableLiveData<Integer>(1);
    }
    public void volumeUp() {
        volume.postValue( volume.getValue() + 5 );
        Log.i( "volumeUp", "Set new volume:" + volume.getValue().toString() );
    }

    public void volumeDown() {
        volume.postValue( volume.getValue() - 5 );
        Log.i( "volumeDown", "Set new volume:" + volume.getValue().toString() );
    }
}

方法fetchPlayerData()volume分配一個新的 MutableLiveData,這會導致在舊數據上注冊的觀察者丟失。 在注冊觀察者之后,它再次在onResume()中被調用。

您可以將fetchPlayerData()更改為如下所示:

volume.postValue(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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