在我的片段布局文件中,我有一个微调器:
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/sp_week"
android:layout_width="150dp"
android:layout_height="50dp"
android:entries="@array/week"
android:paddingLeft="20dp"
android:selectedItemPosition="@={TimeSheetFragViewModel.selectedWeek}">
在TimeSheetFragViewModel类中,我将selectedWeek声明为:
public MutableLiveData<Integer> selectedWeek = new MutableLiveData<>();
public int getSelectedWeek() {
if(selectedWeek.getValue() == null) return 0;
return selectedWeek.getValue();
}
public void setSelectedWeek(int value) {
selectedWeek.setValue(value);
}
在My Fragment中,我将观察者放在onActivityCreated中,以获取此实时数据,如下所示:
timeSheetFragViewModel.selectedWeek.observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
Log.d("DEBUG", "its called");
}
});
当片段第一次加载时,onChanged方法调用一次。我觉得这没关系。但是,当我旋转屏幕时,onChanged方法调用了两次。我需要解释为什么会这样。
那是因为在LiveData
中移除了onDestroy()
观察员。你应该注意到onActivityCreated()
可以多次调用而不调用onDestroy()
。在这种情况下,每次调用onActivityCreate()
时,片段都会将新的观察者实例附加到LiveData,而不会删除先前的观察者。
因此,您必须在LiveData
中观察fragment.onCreate()
- 这实际上并不实用,或者使用getViewLifecycleOwner()
来获得更合理的LifecycleOwner
实例。
例如,在onActivityCreated()
观察的正确方法是:
timeSheetFragViewModel.selectedWeek.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
...
}
});