EditText's selectAll() does not select the tex

2019-06-22 05:52发布

问题:

My situation is: I have a EditText, and under it I have a button, called "select all". It's purpose is to let the user select all the text by pressing it.
When the button is clicked, I invoke selectAll() on the EditText, but instead of selecting all text, in some cases (generally, when the cursor is already positioned within the text somewhere), the cursor is moved to position 0 (start of text) and text remains unselected. Second click on the button will then select all. But of course it should happen on first click.

From this issue: Android EditText selectAll() doesn't works if one taps on the same field in android 4.x only it seems that this is a bug in android 4.0 and above. (Found no mention in Google issue tracker).
Does anyone know about a way to overcome this problem? It seems that the probelm is also in other selection methods and not only selectAll().

(p.s. This question is sort of duplicate of the issue I mentioned above. But I opened another question, because the author of that issue was satisfied and selected a partial answer (of setting android:selectAllOnFocus="true"), while in my case and scenario it does not help me and does not solve the problem.

Thanks.

回答1:

Problem caused by IME. If showed cursor drag pointer then selection must be zero width.

You need cancel drag pointer. It can be doned by change text. For example replace:

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

We replace first symbol of text with same symbol. It cause cancel drag pointer and allow make selection without bug.



回答2:

Try this:

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

Or This:

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

Or this:

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

Or this:

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

Hope this helps .. :)



回答3:

I was having a similar issue. I solved it (using Xamarin in C#, but the equivalent Java will work) with the following code:

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);
}

I have 2 controls: One is a dropdown that lets you select a chicken house and then a set of buttons for each day of the week. Whenever you change the day of week or the chicken house, I want to set focus in the txtMaleCount EditText and then I want the value in that box selected (since it's a number and they're presumably going to replace it).

Clearly, the non-intuitive part was the need to Post it. Doing it directly (on the UI thread) didn't seem to have any effect.