当EditText获得焦点时,选择其中的所有文本

271

我有一个EditText,其中包含一些虚拟文本。当用户点击它时,我希望它被选中,以便当用户开始输入时,虚拟文本将被删除。

我该如何实现这一功能?

12个回答

588

您可以在您的main.xml文件中尝试:

android:selectAllOnFocus="true"

或者在Java中,使用

editText.setSelectAllOnFocus(true);

20
我刚刚了解到,如果UI构建器插入了</requestFocus>标签,则此方法无法正常工作。 - machtnix
@machtnix 给另一个组件添加焦点:https://dev59.com/iHI_5IYBdhLWcg3wBub4#1662088 - Love
你能否更新答案,使其更符合androidX的变化?谢谢 :) - HellBaby

165
editText.setSelectAllOnFocus(true);

如果你想以编程的方式实现,这个方法是可行的。


2
对我来说,上面的解决方案不知何故没有起作用,但编程方式可以。 - Martin Christmann
3
对于仍然对上面接受的回答有问题的人:请尝试使用这个替代方法。已确认可以正常工作(也在Fragments上进行了测试)。 - Hadi Satrio
由于某种奇怪的原因,XML 方式不能有效运行,而这种方式可以。看起来是 SDK 内部有缺陷。 - ar-g
如果您正在编程地进行焦点设置(editText.requestFocus()),请在此之前调用editText.clearFocus()以确保在视图已经聚焦的情况下发生所需的操作。 - Bad Loser

36
EditText dummy = ... 

// android.view.View.OnFocusChangeListener
dummy.setOnFocusChangeListener(new OnFocusChangeListener(){
    public void onFocusChange(View v, boolean hasFocus){
        if (hasFocus) && (isDummyText())
            ((EditText)v).selectAll();
    }
});

谢谢你的帮助,但我更喜欢TheCottonSilk的解决方案,因为我有12个EditText,并且我想尽可能保持我的代码整洁 :) 无论如何还是谢谢! - Galip
@TheCottonSilk的解决方案最适合设计时小部件,而Craftos的答案最适合动态编辑框。 - Bishnu Paudel
2
@Galip OnFocusChangeListener listener = new OnFocusChangeListener... 等等... 然后 editText1.setOnFocusChangeListener(listener)editText2.setOnFocusChangeListener(listener) 等等... - SparK

28

我知道您已经找到了解决方案,但是真正正确的方法是在EditText中使用android:hint属性。当文本框为空且未聚焦时,此文本将显示,但在选择EditText文本框后即会消失。


5
在我的应用程序中,那些字段会被个人详细信息填写并保存。当我加载这些详细信息时,它将替换“虚拟”文本。使用我的当前方法,我还可以在用户输入详细信息后选择文本。谢谢你关心! - Galip

16

通过调用程序的焦点和选择来进行管理

{
editabletext.requestFocus();
editabletext.selectAll();
}

11
为什么不尝试使用android:hint="提示"为用户提供提示..!!

"提示"将在用户单击编辑文本框时自动消失。 这是一种适当且最佳的解决方案。


5
好的回答。但可能会有一些情况,你需要从设置等地方读取值并将其填充到EditText中,并且你希望尽可能简单地更改这些值 :) - nuala

7
您可以在

后为editText添加一个OnClick方法。
_editText.setSelectAllOnFocus(true);

而在此之中:

_editText.clearFocus();
_editText.requestFocus();

一旦您点击editText,整个文本将被选中。

6

SelectAllOnFocus属性只在EditText第一次获取焦点时生效,但如果希望用户每次单击EditText时都选择文本,则需要在两次操作之间调用editText.clearFocus()

例如,如果您的应用程序有一个EditText和一个按钮,在更改EditText后单击按钮会使焦点留在EditText中。然后用户必须使用光标手柄和退格键删除EditText中的内容,然后才能输入新值。因此,在Button的onClick方法中调用editText.clearFocus()


4

3

我尝试了上面的答案,但直到我交换了语句才成功。这是对我有效的方法:

    myEditText.setSelectAllOnFocus(true);
    myEditText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onClickMyEditText();
        }
    });

   private void onClickMyEditText() {
       if(myEditText.isFocused()){
        myEditText.clearFocus();
        myEditText.requestFocus();
       }else{
           myEditText.requestFocus();
           myEditText.clearFocus();
       }
   }

我需要询问是否EditText获得了焦点,如果没有则先请求焦点再清除内容。否则下一次点击EditText时虚拟键盘将永远不会出现。


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