Как очистить EditText по клику? - PullRequest
67 голосов
/ 14 ноября 2010

В Android, как я могу сделать EditText понятным при нажатии?

Например, если у меня есть EditText с некоторыми символами, например 'Enter Name', когда пользователь нажимает на негоэти символы исчезают.

Ответы [ 11 ]

181 голосов
/ 14 ноября 2010

Я не уверен, что вы после этого, но попробуйте этот XML:

android:hint="Enter Name"

Он отображает этот текст, когда поле ввода пустое, выбранное или невыбранное.если вы хотите, чтобы это делалось точно так, как вы описали, назначьте onClickListener для editText и установите его пустым с помощью setText ().

37 голосов
/ 04 июня 2011

Вы ищете поведение, похожее на x, которое отображается справа от текстовых полей на iphone, который очищает текст при нажатии? Это называется 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) {
    }
});
27 голосов
/ 03 июля 2012

после щелчка на любом действии выполните шаг ниже

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

или

, запишите это в XML-файле

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

это прекрасно работает для меня.Надеюсь всем вам.

19 голосов
/ 06 января 2012

@ Ответ Харриса великолепен, я реализовал его как отдельный подкласс EditText, который может упростить его использование, если ваш код уже добавляет TextChangedListeners.

Кроме того, я настроил его так, чтобы, если вы уже используете какие-либо составные Drawables, он оставляет их нетронутыми.

Код здесь, для тех, кто в нем нуждается:

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

}
18 голосов
/ 10 июня 2013

это называется подсказкой в ​​android use android: hint = "Введите имя"

15 голосов
/ 14 ноября 2010

Если вы хотите, чтобы текст редактировался и удалялся, как вы сказали, попробуйте:

    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("");
                }
            }
        }
    });
5 голосов
/ 25 февраля 2012

Будьте внимательны при установке текста с помощью прослушивателя onClick на поле, в котором вы устанавливаете текст. Я делал это и устанавливал текст в пустую строку. Это вызывало появление указателя, указывающего, где был мой курсор, который обычно исчезает через несколько секунд. Когда я не ждал, пока он исчезнет, ​​перед тем как покинуть страницу, вызывая метод finish (), это вызвало утечку памяти и сбой моего приложения. Мне потребовалось некоторое время, чтобы выяснить, что стало причиной аварии на этом ...

В любом случае, я бы порекомендовал использовать selectAll () в прослушивателе по щелчку, а не setText (), если можете. Таким образом, после выделения текста пользователь может начать печатать, и весь предыдущий текст будет очищен.

изображение подозрительного указателя: http://i.stack.imgur.com/juJnt.png

3 голосов
/ 03 февраля 2013

// Очистить при нажатии кнопки «Очистить»

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 голос
/ 20 июня 2013

Код для очистки текстового поля при нажатии

<EditText android:onClick="TextFieldClicked"/>

public void TextFieldClicked(View view){      
      if(view.getId()==R.id.editText1);
           text.setText("");    
}
0 голосов
/ 18 февраля 2017

Для меня самый простой способ ... Создать общедоступный EditText, например «myEditText1»

public EditText myEditText1;

Затем соедините его с EditText, который должен быть очищен

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

После этого создайте пустоту, которая реагирует на нажатие на EditText и позволяет ему очистить текст внутри него, когда он сфокусирован, например

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

        }
    }

Надеюсь, я смогу вам помочь, Всем хорошего дня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...