首页 > 解决方案 > 如何在 android 中同步两个或多个 EditText?

问题描述

我想使用三个 EditText,当用户更改一个 EditText 的内容时,更改应该反映在其他两个 EditText 中。这种行为应该与所有 EditText 相同。假设 e1,e2,e3 是三个 Edittexts 的 id,当用户在 e1 中输入内容时,必须为 e2 和 e3 分配 e1 中的值。如果 e2 被更改,则必须为 e1 和 e3 分配来自 e2 的值。

标签: androidandroid-edittextandroid-textinputedittext

解决方案


您可以使用这个定制的 TextWatcher

例子 :

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SyncTextWatcher syncTextWatcher=new SyncTextWatcher();
    syncTextWatcher.addEditText(
            (EditText)findViewById(R.id.editText1),
            (EditText)findViewById(R.id.editText2),
            (EditText)findViewById(R.id.editText3),
            (EditText)findViewById(R.id.editText4),
            (EditText)findViewById(R.id.editText5)
    );

}

这是 SyncTextWatcher 类

class SyncTextWatcher implements TextWatcher {

    private List<EditText> editTexts = new ArrayList<>();


    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {

        for (int i = 0; i < editTexts.size(); i++) {


            EditText editText = editTexts.get(i);

            if(editText.getText()==s)continue;

            editText.removeTextChangedListener(this);

            editText.setText(s.toString());

            editText.addTextChangedListener(this);
        }

    }

    public void addEditText(EditText... editTexts) {
        for (int i = 0; i < editTexts.length; i++){
            this.editTexts.add(editTexts[i]);
            editTexts[i].addTextChangedListener(this);
        }
    }

    public void removeEditText(EditText editText) {
        boolean b = editTexts.remove(editText);
        if (b) editText.removeTextChangedListener(this);
    }
}

推荐阅读