Android中如何通过ViewModel类在Activity和Fragment之间共享数据?

2024-05-15

我想知道是否可以传递一个在 Activity 类中声明的字符串数据,并将该字符串数据传递给 ViewModel 类,然后将数据传递给 Fragment 类。

视图模型类

class TimeTableViewModel extends ViewModel {

private MutableLiveData<String> start_time_str = new MutableLiveData<>();

void send_StartTime(String start_Time){
    start_time_str.setValue(start_Time);
}

LiveData<String> get_StartTime(){
    return start_time_str;
}}

在 ViewModel 类中,我有MutableLiveData<String> start_time_str它已被初始化为new MutableLiveData<>();

我想用void send_StartTime(String start_Time)Activity 类中用于设置参数值的函数String start_Time并致电start_time_str在片段类中。

活动课

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
            break;
        case R.id.add_schedule_save:
            String start_time_str = startTime.getText().toString();
            Intent intent_restart0 = new Intent(TimeTable_Add_New_Schedule.this, MainActivity.class);
            startActivity(intent_restart0);
            TimeTableViewModel timeTableViewModel = new TimeTableViewModel();
            timeTableViewModel.send_StartTime(start_time_str);
            Toast.makeText(this,""+start_time_str,Toast.LENGTH_LONG).show();
            break;
    }
    return super.onOptionsItemSelected(item);
}

片段类

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    TimeTableViewModel timeTableViewModel = new TimeTableViewModel();
    timeTableViewModel.get_StartTime().observe(getViewLifecycleOwner(), new Observer<String>() {
        @Override
        public void onChanged(String s) {
            mon_textView_11.setText(s);
        }
    });
}

在我调用的 Fragment 类中get_StartTime()函数得到start_time_str并将字符串值设置为我的 TextView。我觉得start_time_str已通过函数成功设置timeTableViewModel.send_StartTime(start_time_str);在 Activity 类中,因为 Toast.maketext 的作用就像一个魅力。但是 TextView 没有显示任何内容。我已经测试过文本颜色不是白色,因此如果正确调用字符串值,它应该出现在屏幕上。如果您有任何建议,我很想听听您的建议。 非常感谢。


这实际上取决于你如何创建你的ViewModel实例。现在你正在创建ViewModel通过其构造函数,但这不是正确的方法。你应该使用ViewModelProvider或由 Google 团队创建的扩展方法。

如果你和ViewModelProvider你应该这样做:

TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);

将正确的上下文传递给ViewModelProvider构造函数调用。如果你在片段中,你只会使用getContext()代替getActivity(),您将不会获得与 Activity 中创建的实例相同的实例。您将创建一个新实例ViewModel,其作用域仅在片段生命周期内。因此,在两个部分的活动上下文中使用以获得相同的实例非常重要。

活动部分:

TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);

片段部分:

TimeTableViewModel viewModel = new ViewModelProvider(getActivity()).get(TimeTableViewModel.class);

重要的是您的片段位于使用此片段的同一活动内ViewModel.

但谷歌的人通过一些扩展方法让我们变得更容易。但据我所知,他们只在 Kotlin 类中工作。因此,如果您有 Kotlin 代码,您可以声明您的ViewModel就像这样:

private val quizViewModel: TimeTableViewModel by activityViewModels()

对于片段范围ViewModel你需要写这样的东西:

private val quizViewModel: TimeTableViewModel by viewModels()

但是你必须将 Kotlin ktx 依赖项添加到你的项目中build.gradle文件。例如这样:

implementation 'androidx.fragment:fragment-ktx:1.1.0'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中如何通过ViewModel类在Activity和Fragment之间共享数据? 的相关文章

随机推荐