EditText,如何在TextWatcher中控制光标?

4

我在EditText上设置了一个TextWatcher,在afterTextChanged方法中,我添加字符到EditText中,然后将光标移动到EditText的末尾继续添加文本,但我遇到了问题。

像这样:

public void afterTextChanged(Editable s) {

    if(edittext.getText().length()==2){

        // append dot to edittext
        edittext.append(".");
        // move cursor at end position in EditText
        edittext.setSelection(edittext.getText().length());
      }
}

在Android 4.0版本或更高版本中,“光标”会停留在“.”之前。在2.2版本中,一切正常,但无论哪个版本,都无法删除字符。
有没有遇到相同问题的人?
问候。
3个回答

5
您可以这样做来避免删除问题...
public class MainActivity extends Activity {
    int count=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText edittext=(EditText)findViewById(R.id.editText1);

        edittext.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable ed) {
                // TODO Auto-generated method stub

                 if(edittext.getText().length()==2 && count < 3){

                        // append dot to edittext
                        edittext.append(".");
                        // move cursor at end position in EditText
                        edittext.setSelection(edittext.getText().length());
                      }
                 count=edittext.getText().length();
            }
        });
    }

1
这是一个糟糕的解决方案。如果用户移动光标会怎样? - Mladen Rakonjac

2
new TextWatcher() {

    int startChanged,beforeChanged,countChanged;

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

    }

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

        startChanged = start;
        beforeChanged = before;
        countChanged = count;
    }


    public void afterTextChanged(Editable s) {
            ...your code here....
            myEditText.setSelection(startChanged+countChanged);
            ...your code here...
        }
    }
};

2

你的代码看起来很好...

但是,如果你删除一个字符,文本长度再次等于2,你的代码将自动再次添加'.'字符 - 所以删除似乎是不可能的。


删除已经被修正,但例如:我想将文本添加到“111”中,我添加“。”,editText保持为“111。”,但光标回退到“。”之前的一个步骤,并且当我添加更多文本时,会添加一个空格字符。 - José Castro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接