使用 ViewModel 处理不同片段之间的数据并进行更新



我正在尝试实现一个日期选择器片段,然后必须将所选日期返回到调用它的片段(父片段(。我已经实现了一个接口,但似乎该接口仅在活动中调用,而不是在片段中调用(即使我显式调用它(。我用日志文件检查了这个。

因此,我继续使用 ViewModel 类来保存数据。现在的问题是,我能够将数据存储在 ViewModel 类中,但我不知道在父片段中的哪个位置调用 ViewModel 的函数。在OnCreate/OnCreateView上调用它无济于事,因为片段已经加载。在 OnResume/OnAttach 上调用它会使应用崩溃,并显示空指针引用。

public class ShareData extends ViewModel{
private int year, month, day;
private String date;
public void getDate(int y, int m, int d)
{
Log.d("Viewmodel is", Integer.toString(year) + " " + Integer.toString(month) + " " + Integer.toString(day));
year = y;
month = m;
day = d;
}
public String setDate()
{
return (Integer.toString(year) + "-" + Integer.toString(month) + "-" + Integer.toString(day));
}

}

这是来自日期选取器对话框片段的代码:

public void onDateSet(DatePicker view, int year, int month, int day) {
viewModel.getDate(year,month+1,day);
datePicked.onDatePicked(view, year, month+1, day);
// Do something with the date chosen by the user
}

这是我的父片段:

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.operations_static_new, container, false);
name = view.findViewById(R.id.patient_name);
id = view.findViewById(R.id.patient_id);
date_textview = view.findViewById(R.id.date_static);
date_textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmDatePicker(); //this opens fragment to choose date
}
});
model = ViewModelProviders.of(getActivity()).get(ShareData.class);
date_textview.setText(model.setDate());
}

在哪里调用 date_textview.setText 以便日期显示在日期选择器的文本视图上?

我在 ViewModel 中看不到任何 LiveData,这告诉我您没有正确使用它。您应该做的是将视图模型中的实时数据绑定到要更新的片段。之后,在观察视图模型的任何片段中接收更改通知是微不足道的。

因此,从您的 ViewModel 开始,应该看起来像这样:

// This will now notify the fragment that is observing of any changes made
public class SharedData extends ViewModel {
private int year, month, day;
private MutableLiveData<String> date = new MutableLiveData<>();
// This will notify observing fragments of changes
public void setDate(int y, int m, int d) {
year = y; month = m; day = d;
date.setValue(year + "-" + month + "-" + day);
}
// This is a factory method for getting the LiveData the fragment will bind to
public LiveData<String> getDate() {
return date;
}
}

在日期更改时更新的片段(父级(中,您可以执行类似操作来监视上面示例中的 getDate((。这是在孩子或其他任何内容完成更新后进行更新所需的内容:

取代

date_textview.setText(model.setDate());

viewModel.getDate().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String newDate) {
// Update your view with the new data
dateTextView.setText(newDate);
}
});

设置完成后,您可以从任何您想要的位置调用 setDate(y,m,d(,它将始终更新正在观察它的片段。

https://developer.android.com/topic/libraries/architecture/viewmodelhttps://developer.android.com/topic/libraries/architecture/viewmodel

相关内容

  • 没有找到相关文章

最新更新