gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:12:54 26 4
gpt4 key购买 nike

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

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在 fragment 类中。
Activity 课
@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);
}
fragment 类
@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 没有显示任何内容。我已经测试过文本颜色不是白色,因此如果正确调用了字符串值,它应该出现在屏幕上。 如果您有任何建议,我很想听听您的建议。
非常感谢。
enter image description here

最佳答案

这真的取决于你如何创建你的ViewModel实例。现在您正在创建 ViewModel通过它的构造函数,但这不是正确的方法。您应该使用 ViewModelProvider或由 Google 团队创建的扩展方法。
如果你选择 ViewModelProvider你应该这样做:

TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
将正确的上下文传递给 ViewModelProvider 很重要。构造函数调用。如果您在 fragment 中,您将只使用 getContext()而不是 getActivity() ,您将不会获得与在 Activity 中创建的相同实例。您将创建 ViewModel 的新实例,这将仅在 fragment 生命周期内限定。因此,在两个部分的 Activity 上下文中使用以获得相同的实例很重要。
Activity 部分:
TimeTableViewModel viewModel = new ViewModelProvider(this).get(TimeTableViewModel.class);
fragment 部分:
TimeTableViewModel viewModel = new ViewModelProvider(getActivity()).get(TimeTableViewModel.class);
重要的是,您的 fragment 位于使用此 ViewModel 的同一 Activity 中。 .
但是谷歌的伙计们通过一些扩展方法让我们变得更容易了。但据我所知,他们只在 Kotlin 类(class)中工作。所以如果你有 Kotlin 代码,你可以声明你的 ViewModel就像这样:
private val quizViewModel: TimeTableViewModel by activityViewModels()
对于 fragment 范围 ViewModel你需要写这样的东西:
private val quizViewModel: TimeTableViewModel by viewModels()
但是你必须在你的项目中添加 Kotlin ktx 依赖 build.gradle文件。例如像这样:
implementation 'androidx.fragment:fragment-ktx:1.1.0'

关于android - 如何在 Android 中通过 ViewModel 类在 Activity 和 Fragment 之间共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60885459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com