EditText的selectAll()不选择文本,而是将光标移动到位置0

时间:2014-04-08 10:07:36

标签: android android-edittext

我的情况是:我有一个EditText,在它下面我有一个名为“全选”的按钮。它的目的是让用户通过按下它来选择所有文本 单击按钮时,我在selectAll()上调用EditText,但在某些情况下(通常,当光标已经位于文本中某处时),不是选择所有文本,而是移动光标定位0(文本开头)和文本保持未选中状态。再次单击该按钮将选择全部。但当然应该在第一次点击时发生。

从这个问题:Android EditText selectAll() doesn't works if one taps on the same field in android 4.x only似乎这是Android 4.0及更高版本中的一个错误。 (在Google问题跟踪器中没有提及) 有谁知道克服这个问题的方法?似乎问题也出现在其他选择方法中,而不仅仅是selectAll()

(ps这个问题与我上面提到的问题有点重复。但我打开了另一个问题,因为该问题的作者满意并选择了部分答案(设置android:selectAllOnFocus="true"),而在我的案例和场景中它对我没有帮助,也没有解决问题。

感谢。

3 个答案:

答案 0 :(得分:6)

IME引起的问题。如果显示光标拖动指针,则选择必须为零宽度。

您需要取消拖动指针。它可以通过更改文本进行。例如replace

            Editable text = edit.getText();
            if (text.length() > 0) {
                text.replace(0, 1, text.subSequence(0, 1), 0, 1);
                edit.selectAll();
            }

我们用相同的符号替换文本的第一个符号。它会导致取消拖动指针并允许选择没有错误。

答案 1 :(得分:1)

试试这个:

yourEditText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        //((EditText)v).selectAll();
        ((EditText)v).setSelection(startValue, stopValue);
    }
});

或者这个:

yourEditText.setOnFocusChangedListener(new OnFocusChangedListener(){
    @Override
    public void onFocusChange(View v, boolean hasFocus){
        if (hasFocus){
            //((EditText)v).selectAll();
            ((EditText)v).setSelection(startValue, stopValue);
        }
    }
});

或者这个:

theEditText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        EditText editText = (EditText)view;
        editText.setSelection(editText.getText().length()-1); // selects all the text
    }
});

或者这个:

theEditText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        EditText editText = (EditText)view;
        editText.performLongClick();
    }
});

希望这会有所帮助.. :)

答案 2 :(得分:1)

我遇到了类似的问题。我用以下代码解决了它(在C#中使用Xamarin,但是等效的Java可以工作):

private void InitFocus()
{
    Java.Lang.Runnable rable = new Java.Lang.Runnable(()=> 
    {
        EditText maleCount = FindViewById<EditText>(Resource.Id.txtMaleCount);
        maleCount.RequestFocus();
        maleCount.SelectAll();
    });
    new Handler().Post(rable);
}

我有2个控件:一个是下拉菜单,可让您选择一个鸡舍,然后为一周中的每一天选择一组按钮。每当你改变星期几或鸡舍时,我想在txtMaleCount EditText中设置焦点然后我想要选中该框中的值(因为它是一个数字而且它们可能会发生变化替换它)。

显然,非直观的部分是需要Post它。直接(在UI线程上)这样做似乎没有任何效果。