如何在多个 EditText 中键入数据后使用 ViewModel 更新 TextView?
How to use ViewModel to update TextView after typing data in several EditTexts?
我有 3 个问题,每个问题都显示在一个片段中。在每个问题之后,都有一个包含 TextView 的片段,其中包含在前一个问题片段的 EditText 中输入的答案。我设法实现了第一个问题的输入数据显示在第二个片段中,但是当我转到下一个问题时,在 EditText 中有第一个问题的数据。我如何使用此处显示的代码,以便每个问题的输入仅显示在下一个片段中? (片段:问题1 --> 答案1 --> 问题2 --> 答案2 --> 问题3 --> 答案3)
这是前两个片段和模型视图的代码:
第一个问题片段:
public class FragmentQuestion1 extends Fragment {
private Button btnNavFrag1;
private EditText mEditTextQuestion1;
private SharedViewModel viewModel;
@Nullable
@Override
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(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String answer) {
viewModel.setAnswer(1, answer);
mEditTextQuestion1.setText(answer);
}
});
}
第一个答案概述片段:
public class FragmentAnswer1 extends Fragment {
private View btnNavFragAns1;
private TextView tv_answer1;
private SharedViewModel viewModel;
@Nullable
@Override
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(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String answer) {
viewModel.setAnswer(1, answer);
tv_answer1.setText(answer);
}
});
}
共享视图模型:
public class SharedViewModel extends ViewModel {
public HashMap<Integer, MutableLiveData<String>> answers = new HashMap<Integer, MutableLiveData<String>>(){{
put(1, new MutableLiveData<String>());
put(2, new MutableLiveData<String>());
put(3, new MutableLiveData<String>());
}};
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);
}
}
}
您只需要一个共享 ViewModel
,它存储 LiveData
个答案列表,也许还有一个问题列表。
这是您 SharedViewModel
的更新版本:
public class ContestViewModel extends ViewModel {
private HashMap<Int,LiveData<String>> answers = new HashMap<>();
public LiveData<String> getAnswer(int questionId) {
return answers.get(questionId);
}
public void setAnswer(int questionId, String answer) {
// TODO make sure that answers.get is not null
answers.get(questionId).setValue(answer);
}
}
现在,在每个片段中调用 viewModel.getAnswer(id)
。因此,他们每个人都有一个单独的实时数据 question/answer。
我有 3 个问题,每个问题都显示在一个片段中。在每个问题之后,都有一个包含 TextView 的片段,其中包含在前一个问题片段的 EditText 中输入的答案。我设法实现了第一个问题的输入数据显示在第二个片段中,但是当我转到下一个问题时,在 EditText 中有第一个问题的数据。我如何使用此处显示的代码,以便每个问题的输入仅显示在下一个片段中? (片段:问题1 --> 答案1 --> 问题2 --> 答案2 --> 问题3 --> 答案3)
这是前两个片段和模型视图的代码:
第一个问题片段:
public class FragmentQuestion1 extends Fragment {
private Button btnNavFrag1;
private EditText mEditTextQuestion1;
private SharedViewModel viewModel;
@Nullable
@Override
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(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String answer) {
viewModel.setAnswer(1, answer);
mEditTextQuestion1.setText(answer);
}
});
}
第一个答案概述片段:
public class FragmentAnswer1 extends Fragment {
private View btnNavFragAns1;
private TextView tv_answer1;
private SharedViewModel viewModel;
@Nullable
@Override
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(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String answer) {
viewModel.setAnswer(1, answer);
tv_answer1.setText(answer);
}
});
}
共享视图模型:
public class SharedViewModel extends ViewModel {
public HashMap<Integer, MutableLiveData<String>> answers = new HashMap<Integer, MutableLiveData<String>>(){{
put(1, new MutableLiveData<String>());
put(2, new MutableLiveData<String>());
put(3, new MutableLiveData<String>());
}};
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);
}
}
}
您只需要一个共享 ViewModel
,它存储 LiveData
个答案列表,也许还有一个问题列表。
这是您 SharedViewModel
的更新版本:
public class ContestViewModel extends ViewModel {
private HashMap<Int,LiveData<String>> answers = new HashMap<>();
public LiveData<String> getAnswer(int questionId) {
return answers.get(questionId);
}
public void setAnswer(int questionId, String answer) {
// TODO make sure that answers.get is not null
answers.get(questionId).setValue(answer);
}
}
现在,在每个片段中调用 viewModel.getAnswer(id)
。因此,他们每个人都有一个单独的实时数据 question/answer。