android - 如何在不同的 Fragment 上使用 ModelView 来获取 EditText 的输入并将 TextView 设置为其值?
问题描述
所以基本上我想要实现的是将 EditText 的输入显示到另一个 Fragment 的 TextView 中。因此,用户回答一个问题并单击一个按钮,该按钮将他带到下一个片段,在 TextView 中应该显示他的答案。由于我使用相同的方法有 3 个问题,因此我使用 ModelView 来实现这一点。由于我对编程比较陌生,我不知道这是否是我实现它的正确方法。非常感谢您的帮助!
这是我的视图模型:
public class SharedViewModel extends ViewModel {
private HashMap<Integer, MutableLiveData<String>> answers = new HashMap<>();
public MutableLiveData<String> getAnswer(int questionId) {
return answers.get(questionId);
}
public void setAnswer(int questionId, String answer) {
if (answers.get(questionId) != null) {
answers.get(questionId).setValue(answer);
}
}
}
这是我第一个问题的第一个片段:
...
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_question_1, container, false);
btnNavFrag1 = view.findViewById(R.id.btn_question1);
mEditTextQuestion1 = view.findViewById(R.id.edit_text_question_1);
btnNavFrag1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModel.getAnswer(1);
((GameActivity)getActivity()).setViewPager(2);
}
});
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
viewModel.getAnswer(1).observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
mEditTextQuestion1.setText(charSequence);
}
});
}
这是我的答案概述片段,它显示在第一个问题片段之后,输入的答案应该替换 TextView 的默认值:
...
public View onCreateView( LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_question_answer_1, container, false);
btnNavFragAns1 = view.findViewById(R.id.next_question_1);
tv_answer1 = view.findViewById(R.id.answer_player_1_text_view);
btnNavFragAns1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((GameActivity)getActivity()).setViewPager(3);
}
});
return view;
}
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
viewModel.getAnswer(1).observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
@Override
public void onChanged(@Nullable CharSequence charSequence) {
tv_answer1.setText(charSequence);
}
});
}
}
Currently I get a NullPointerException at this line:
viewModel.getAnswer(1).observe(getViewLifecycleOwner(), new Observer<CharSequence>() {
解决方案
在代码的这个特定部分中:您没有为key 1 上的 get answer设置任何值,您应该首先将MutableLiveData 设置为 key "1":
viewModel.getAnswer(1)
首先,您必须将某些内容作为键 1 放入private HashMap<Integer, MutableLiveData<String>> answers = new HashMap<>();
:
answers.put(1, new MutableLiveData<String>());
之后,您可以通过代码访问可变的实时数据:viewModel.getAnswer(1)
推荐阅读
- regex - 创建一个“除特定字符之外的所有内容”正则表达式
- reactjs - 在 MUI 中更改 TextField 字体颜色?
- vb.net - 1 行 Datagridview 上的 ArgumentOutOfRangeException
- unix - 在 Unix 中更改文件名中已有数字的多个文件名
- http - 浏览器渲染的最小块大小
- php - php 致命错误:未捕获的错误:找不到类“路由器”
- docker - docker run“--cpus”标志令人困惑
- java - android中的AES加密和nodejs中的解密
- javascript - 如何将 Webpack 构建哈希注入应用程序代码
- android - 调用 activity.onSaveInstanceState() 后的 commit() 片段事务