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

用户名

我想知道是否可以传递在Activity类中声明的String数据并将String数据传递给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_Timestart_time_str在Fragment类中调用

活动课

@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_strString值并将其设置为TextView。我认为ToTostart_time_str已成功通过timeTableViewModel.send_StartTime(start_time_str);Activity类中的function设置,因为Toast.maketext的工作方式很吸引人。但是,TextView不会显示任何内容。我测试了“文本颜色”不是白色,因此如果正确调用了字符串值,则它应该出现在屏幕上。如果您有任何建议,我很想听听您的建议。非常感谢你

在此处输入图片说明

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

如果您使用ViewmodelProvider,则应该这样:

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

将正确的上下文传递给of方法调用很重要如果您处于片段状态,getContext()仅使用代替getActivity(),则将不会获得与在Activity中创建的实例相同的实例。您将创建一个ViewModel的新实例,该实例仅在片段生命周期内范围内。因此,在两个部分的活动上下文中使用以获得相同的实例很重要。

活动部分:

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

片段部分:

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

重要的是,您的片段必须位于与使用此ViewModel相同的活动中。

但是Google的家伙通过一些扩展方法使我们更容易。但据我所知,它们仅在科特林班上工作。因此,如果您有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'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法在Activity和Fragment之间共享Viewmodel:

Android在Activity和Fragment之间传递数据

我如何使用LiveData和ViewModel类将数据从Activity发送到Fragment

Android-Activity和Android-Fragment之间的关系是什么?UML类图中的活动/片段和ViewModel?

android中的activity和fragment之间的关系

android中的activity和fragment之间的关系

如何在主Activity中的Fragment之间共享属性和方法

如何在Android中的片段和活动之间共享数据

Android:如何高效地在 Fragment 和 Activity 之间发送和接收数据?

如何使用Activity和Fragment之间的接口双向发送数据

如何通过VIEWMODEL从数据库(MODEL)中的Activity(VIEW)获取添加的对象的ID。Android,MVVM

如何在模块和类之间共享方法和数据?

如何在Activity和View类之间传输数据?

如何使用Koin DI在Activity之间共享ViewModel的相同实例?

在Activity和View类之间传递数据

如何在 React 中的 render 和 componentDidMount 之间共享数据?

如何避免实例之间共享类数据?

在不同的ViewModel之间共享数据

ViewModel在Activity中设置数据并在Fragment中使用

Android在片段和对话框片段之间共享ViewModel?

Xamarin Architechture,用于在Android平台和ViewModel之间共享事件

Android 在两个 Fragment 之间共享数据

如何通过数据绑定在viewModel和MainActivity之间进行通信?

在Rails和Sinatra之间通过memcached共享数据时,如何修复Sinatra不处理ActiveSupport

在类和结构视图之间共享数据绑定

如何在实体框架中的多个数据库之间共享类?

我如何使用上下文在React中的类和功能组件之间共享状态?

OOP - 在类之间共享数据

NSDictionary数据在类之间共享