【问题标题】:How to change a TextView in a Fragment with the input of the EditText of the previous Fragment?如何使用前一个 Fragment 的 EditText 的输入来更改 Fragment 中的 TextView?
【发布时间】:2019-09-23 17:15:04
【问题描述】:

我已经实现了另一个教程中的代码,但我不知道如何使用此代码更改 TextView。我知道我必须使用 ViewModel 的 setAnswer 但我不知道在哪里使用它。我对编程比较陌生,因此非常感谢您的帮助!在第一个问题之后,还有另外 2 个问题,每个问题都有一个 EditText,输入的内容也应该显示在问题的下一个片段中。

这是我的 ViewModel:

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

这是我的带有 EditText 的片段:

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

    mEditTextQuestion1.addTextChangedListener(new NumberTextWatcher(mEditTextQuestion1));

    m_bar = view.findViewById(R.id.progress_bar_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) {
            tv_answer1.setText(answer);
        }
    });
}

这是我的第二个片段,前一个 EditText 的输入应该显示在 TextView 中:

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) {
            tv_answer1.setText(answer);
        }
    });
}
}

【问题讨论】:

    标签: android android-fragments hashmap


    【解决方案1】:
    1. Create a global variable(String) 存储您的 EdiText 的文本
    2. 当您使用EditText 打开Fragment 时,您可以使用Button (onClickListener)onDetached 来设置您的全局变量。

      ((MyApplication) this.getApplication()).setSomeVariable(edittext.getText().toString());

    3. 当您使用TextView 返回您的Fragment 时,您将其添加到void onStart()

      textview.setText(((MyApplication) this.getApplication()).getSomeVariable());

    【讨论】:

    • 但是为什么我在 ViewModel 中有 setAnswer 方法呢?
    • @DanielSpatz 我不知道。为此,您不需要 ViewModel。您可以从片段中设置文本。
    • 这段代码是全新的,但我想知道如何使用现有代码来实现结果。我的意思是我已经调用了 textview.setText 方法
    • 问题是,在第一个问题之后,EditText 还有 3 个其他问题,所以我需要 ViewModel
    • @DanielSpatz 您可以保留您的 ViewModel。但是要更改TextView,最好使用全局变量。也可以从 ViewModel 访问字符串。
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2020-03-08
    • 2016-04-20
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多