为什么不调用LiveData观察者?(Android,片段)



即使LiveData值发生变化,也不会调用My Observer。我做错了什么?

观察者和模型在片段中初始化。按钮用于通过一个方法(计算之后是一个集合方法)更改模型中的值。然而,观察者没有记录到模型值的任何变化。

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();
}
}

ViewModel


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一个新的mutableelvedata,这会导致在旧观察者上注册的观察者丢失。在观察者注册后,在onResume()中再次调用。

您可以将fetchPlayerData()更改为如下内容:

volume.postValue(1)

最新更新