我想知道是否可以传递在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_Time
并start_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_str
String值并将其设置为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] 删除。
我来说两句