0

我的屏幕上有 6 个编辑文本(用于输入 6 个数字)如果我在一个 EditText 字段上输入 1 个数字,焦点应该转到下一个,依此类推。如果我在某些编辑文本字段上回击空格,则焦点应位于前一个编辑文本字段

为此,我使用了以下代码

 EditText2.addTextChangedListener(new TextWatcher() {

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

            if (EditText2.getText().toString().length() == 1) {
                EditText3.requestFocus();
            }
            else if (EditText2.getText().toString().length() == 0) {
                EditText1.requestFocus();
            }
        }

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

        }

        public void afterTextChanged(Editable s) {

        }
    });

通常,如果我没有在任何编辑文本上按退格键,ontextchange 侦听器就会工作。如果我在 EditText2 上按退格键并降落在 EditText1 上(存在某些值)并尝试在其上输入一些内容。由于 addTextChangedListener 不起作用,光标不会转到 EditText2。

任何帮助是极大的赞赏。

4

1 回答 1

0

我假设您可能已经将EditText字段设置maxLength为 1。像这样:

<EditText
    android:id="@+id/edit_text_one"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLength="1"
    android:inputType="number"
    android:digits="0123456789"
    />

当 yourmaxLength设置为 1TextWatcher时,尝试输入其他字符时不会触发 。解决问题的一种方法是向后移动以使用editText.setSelection(0, editText.length());参见下面的工作示例:

final List<EditText> fields = new ArrayList<>();

fields.add((EditText) findViewById(R.id.edit_text_one));
fields.add((EditText) findViewById(R.id.edit_text_two));
fields.add((EditText) findViewById(R.id.edit_text_three));
fields.add((EditText) findViewById(R.id.edit_text_four));
fields.add((EditText) findViewById(R.id.edit_text_five));
fields.add((EditText) findViewById(R.id.edit_text_six));

for (EditText editText : fields) {
  editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
      for (int i = 0; i < fields.size(); i++) {
        // Determine which one of the fields is focused
        if (fields.get(i).hasFocus()) {
          if (charSequence.length() == 1) {
            // If the focused field has a character in it, move to the next field
            if (fields.size() > i + 1) {
              EditText nextField = fields.get(i + 1);
              nextField.requestFocus();
            }
          } else if (charSequence.length() == 0) {
            // If the focused field was deleted, move to the previous field
            if (i - 1 >= 0) {
              EditText prevField = fields.get(i - 1);
              prevField.requestFocus();
              // Select the text so it will be replaced when pressing another button
              prevField.setSelection(0, prevField.getText().length());
            }
          }
          break;
        }
      }
    }

    @Override public void afterTextChanged(Editable editable) {}
  });
}
于 2017-09-10T23:15:49.903 回答