【问题标题】:EditText - Cursor coming to start for every letter when clear textEditText - 明文时每个字母都会出现光标
【发布时间】:2017-01-31 18:16:55
【问题描述】:

我将TextWatcher 设置为EditText,如下所示。但是当我尝试清除文本时,光标会在清除每个字母后开始。

  class MyInputWatcher implements TextWatcher {

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

    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        et.removeTextChangedListener(watcher2);
        et.setText(s.toString().replaceAll("[^[:alpha:]]", ""));
        et.addTextChangedListener(watcher2);
    }
    @Override
    public void afterTextChanged(Editable s) {

    }
}

【问题讨论】:

  • afterTextChanged中使用你的代码

标签: android android-edittext textwatcher


【解决方案1】:

这样做(更新):

class MyInputWatcher implements TextWatcher {

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

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        String temp = s.toString().replaceAll("[^a-zA-Z]", "");
        if (s.toString().length() != temp.length()) {
            et.setText(temp);
            et.setSelection(temp.length());
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
}

【讨论】:

  • 这会导致堆栈溢出异常
  • 这工作正常,但每当粘贴文本时,光标会自动移动到最后一个位置。在正常的编辑文本中它不会像这样移动。
  • 我认为那将需要大量定制。
【解决方案2】:

请这样尝试

editText.setSelection(editText.getText().toString().length());

【讨论】:

    【解决方案3】:

    Subhash Kumar,你可以使用方法:

    et.setSelection(position)
    

    用于在需要的位置显示光标

    【讨论】:

      【解决方案4】:

      像这样在 afterTextChanged() 方法上设置光标的位置。

      class MyInputWatcher implements TextWatcher {
      
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count,
              int after) {
      
      }
      @Override
      public void onTextChanged(CharSequence s, int start, int before,
              int count) {
          et.removeTextChangedListener(watcher2);
          et.setText(s.toString().replaceAll("[^[:alpha:]]", ""));
          et.addTextChangedListener(watcher2);
      }
      @Override
      public void afterTextChanged(Editable s) {
          et.setSelection(et.getText().toString().length())
      }
      

      }

      【讨论】:

      • 这会将光标移动到文本的末尾。如果我想从中间清除,这将不起作用
      【解决方案5】:

      每次您清除一个字符时,它都会调用onTextChanged() 方法,作为您的实现,它会获取edittext 文本并返回设置为它,因此光标会到达文本的开头。清除et.setText(s.toString().replaceAll("[^[:alpha:]]", ""));,它将被修复。或者使用这个et.setSelection(et.getText().toString().length+1);

      【讨论】:

      • 这会将光标移动到文本的末尾。如果我想从中间清除,这将不起作用
      • 然后清除这个et.setText(s.toString().replaceAll("[^[:alpha:]]", ""));
      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多