如何在单击时清除EditText?


69

在Android中,如何EditText清除它的单击时间?

例如,如果我输入了EditText,其中包含一些字符,例如'Enter Name',当用户单击它时,这些字符就会消失。


1
步骤1:将一个onClick侦听器添加到EditText步骤2:在侦听器中,将EditText内容设置为空字符串步骤3:获利
B

2
人,保存自己一些时间和阅读Specur答案应该是在这里接受的答案stackoverflow.com/a/4175442/360211
韦斯顿

Answers:


184

我不确定是否要这样做,但是请尝试以下XML:

android:hint="Enter Name"

当输入字段为空,选中或未选中时,它将显示该文本。

或者,如果您希望它完全按照您的描述进行操作,请在editText上分配一个onClickListener,然后使用setText()将其设置为空。


37

您是否正在寻找与iphone上文本字段右侧显示的x相似的行为,以便在点击时清除文本?那里叫做clearButtonMode。这是在Android EditText视图中创建相同功能的方法:

String value = "";//any text you are pre-filling in the EditText

final EditText et = new EditText(this);
et.setText(value);
final Drawable x = getResources().getDrawable(R.drawable.presence_offline);//your x image, this one from standard android images looks pretty good actually
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);
et.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (et.getCompoundDrawables()[2] == null) {
            return false;
        }
        if (event.getAction() != MotionEvent.ACTION_UP) {
            return false;
        }
        if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
            et.setText("");
            et.setCompoundDrawables(null, null, null, null);
        }
        return false;
    }
});
et.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
    }

    @Override
    public void afterTextChanged(Editable arg0) {
    }

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

1
对于实现所有不同textfield clearbutton选项的该代码版本,请看此处stackoverflow.com/questions/6274021/…–
哈里斯(Harris)

绝对好 如果像我一样,如果您已经在使用复合可绘制对象(编辑文字左侧的搜索字形),则需要进行一些编辑。我在下面将其发布为EditText的子类。
卡洛斯·P

1
注意:如果您的图标大于EditText,并且您不希望在清除或添加文本时不断调整EditText的大小,请根据具体情况将绘图对象的alpha设置为0或255
Daiwik Daarun

1
进一步说明:1.)Harris的解决方案可以与OnFocusChangeListener结合使用,以便仅在当前编辑EditText时显示图标。2.)onTouchListener的条件可以组合为一个条件(更易于阅读)。3)v.playSoundEffect(SoundEffectConstants.CLICK)当删除文本时,我还向onTouchListener添加了一些含蓄的反馈。
AustrianDude

在OnTouchListener.onTouch()中,清除字段很可能应该返回“ true”。
northernman

28

在单击任何动作后,请执行以下步骤

((EditText) findViewById(R.id.yoursXmlId)).setText("");

要么

将其写入XML文件

<EditText
---------- other stuffs ------ 
android:hint="Enter Name" /> 

它对我来说很好。希望大家。


1
最简单,更准确的答案。谢谢!
路易吉·西里


19

@Harris的答案很好,我已将其实现为EditText的单独子类,如果您的代码已添加TextChangedListeners,则可以更轻松地使用它。

另外,我还对其进行了调整,以便在您已经使用任何“复合可绘制对象”的情况下,将它们完整保留。

代码在这里,适合任何需要它的人:

package com.companyname.your

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

public class ClearableEditText extends EditText {

    public String defaultValue = "";
    final Drawable imgX = getResources().getDrawable(android.R.drawable.presence_offline ); // X image


    public ClearableEditText(Context context) {
        super(context);

        init();
    }

    public ClearableEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        init();
    }

    public ClearableEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

        init();
    }


    void init()  {

        // Set bounds of our X button
        imgX.setBounds(0, 0, imgX.getIntrinsicWidth(), imgX.getIntrinsicHeight());      

        // There may be initial text in the field, so we may need to display the button
        manageClearButton();

        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                ClearableEditText et = ClearableEditText.this;

                // Is there an X showing?
                if (et.getCompoundDrawables()[2] == null) return false;
                // Only do this for up touches
                if (event.getAction() != MotionEvent.ACTION_UP) return false;
                // Is touch on our clear button?
                if (event.getX() > et.getWidth() - et.getPaddingRight() - imgX.getIntrinsicWidth()) {
                    et.setText("");
                    ClearableEditText.this.removeClearButton();
                }
                return false;
            }
        });

        this.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                ClearableEditText.this.manageClearButton();
            }

            @Override
            public void afterTextChanged(Editable arg0) {
            }

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

    void manageClearButton() {
        if (this.getText().toString().equals("") )
            removeClearButton();
        else
            addClearButton();
    }
    void addClearButton() {
        this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                this.getCompoundDrawables()[1],
                imgX,
                this.getCompoundDrawables()[3]);
    }
    void removeClearButton() {
        this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                this.getCompoundDrawables()[1],
                null,
                this.getCompoundDrawables()[3]);
    }

}

1
在OnTouchListener.onTouch()中,清除字段时应返回“ true”。这表明您已经按照OnTouchListener规范使用了该事件。
northernman

16

如果要在编辑文本中包含文本,然后按照您说的删除它,请尝试:

    final EditText text_box = (EditText) findViewById(R.id.input_box);
    text_box.setOnFocusChangeListener(new OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus) 
        {
            if (hasFocus==true)
            {
                if (text_box.getText().toString().compareTo("Enter Text")==0)
                {
                    text_box.setText("");
                }
            }
        }
    });

好答案!顺便说一句,您可以只说if(hasFocus)而不是说if(hasFocus == true):)
rizalp1 2011年

5

在您要设置文本的字段上使用onClick侦听器设置文本时要小心。我正在这样做,并将文本设置为空字符串。这导致指针向上指示我的光标在哪里,通常在几秒钟后消失。当我不等它离开页面而导致finish()被调用之前消失时,它将导致内存泄漏并使我的应用程序崩溃。花了我一段时间才弄清楚是什么原因导致此崩溃。

无论如何,我建议您在点击监听器中使用selectAll(),而不是setText()。这样,一旦选择了文本,用户就可以开始键入并且所有先前的文本都将被清除。

可疑指针的图片:http : //i.stack.imgur.com/juJnt.png


3

//当单击清除按钮时清除

firstName =(EditText)findViewById(R.id.firstName);

    clear = (Button) findViewById(R.id.clearsearchSubmit);

    clear.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.clearsearchSubmit);
            firstName.setText("");
        }
    });

这将有助于清除您输入的错误关键字,因此您无需反复按Backspace键,只需单击按钮即可清除所有内容。希望能帮助到你


1
非常简单。.谢谢
STS

1

单击时清除文本字段的代码

<EditText android:onClick="TextFieldClicked"/>

public void TextFieldClicked(View view){      
      if(view.getId()==R.id.editText1);
           text.setText("");    
}

0
((EditText) findViewById(R.id.User)).setText("");
((EditText) findViewById(R.id.Password)).setText("");

0

对我来说,最简单的方法是...创建一个公共的EditText,例如“ myEditText1”

public EditText myEditText1;

然后,将其与应清除的EditText连接

myEditText1 = (EditText) findViewById(R.id.numberfield);

在那之后,创建一个空隙,对单击EditText做出反应,让它在聚焦时清除其中的Text,例如

@OnClick(R.id.numberfield)
        void textGone(){
            if (myEditText1.isFocused()){
                myEditText1.setText("");

        }
    }

希望我能为您提供帮助,大家度过愉快的一天

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.