android - 如何在不同的 fragment 上使用 ModelView 来获取 EditText 的输入并将 TextView 设置为其值?

标签 android android-fragments nullpointerexception android-viewmodel

所以基本上我想要实现的是将 EditText 的输入显示到另一个 Fragment 的 TextView 中。因此,用户回答一个问题并单击一个按钮,该按钮将他带到下一个 fragment ,在 TextView 中应显示他的答案。由于我使用相同的方法有 3 个问题,因此我使用 ModelView 来实现此目的。由于我对编程比较陌生,所以我不知道这是否是我实现它的正确方法。非常感谢您的帮助!

这是我的 View 模型:

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);
    }
}
}

这是我第一个问题的第一个 fragment :

   ...

    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);
            }
        });
    }

这是我的答案概述 fragment ,它显示在第一个问题 fragment 之后,输入的答案应该替换 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>() {

最佳答案

在代码的这个特定部分:您没有为 get answer on key 1 设置任何值,您应该首先为键 设置 MutableLiveData” 1":

viewModel.getAnswer(1)

首先,你必须在 private HashMap<Integer, MutableLiveData<String>> answers = new HashMap<>(); 中输入一些东西作为键 1 :

answers.put(1, new MutableLiveData<String>());

之后您可以通过代码访问可变的实时数据:viewModel.getAnswer(1)

关于android - 如何在不同的 fragment 上使用 ModelView 来获取 EditText 的输入并将 TextView 设置为其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048543/

相关文章:

Java:简单但不寻常的 NullPointerException

Android ViewPagerIndicator 设置标题

android - 由于 facebookconnect 插件,Android 的 Phonegap 构建失败

android - 使用 Fluidsynth 在 Android 上播放来自 SoundFonts 的音符

android - 在从 AsyncTaskLoader 完成 onLoadFinished 后动态更新 Fragment 的 UI - 无法获取 ViewGroup

Nougat 7.0 API 24 和 7.1 API 25 中的 Android 布局间距发生了变化

android - 从列表适配器调用 fragment

java - 分割字符串时的"java.lang.NullPointerException"

android - ViewPager.PageTransformer 无法解析为类型

java - ProgressBar 空点异常导致应用程序崩溃