Wie lösche ich einen EditText beim Klicken?

69

Wie kann ich in Android EditTextdeutlich machen , wenn darauf geklickt wird?

ZB, wenn ich ein EditTextmit einigen Zeichen in habe, z. B. 'Enter Name'wenn der Benutzer darauf klickt, verschwinden diese Zeichen.

Entropy1024
quelle
1
Schritt 1: Hinzufügen eines onClick-Listeners zum EditText Schritt 2: Setzen Sie im Listener den EditText-Inhalt auf eine leere Zeichenfolge. Schritt 3: Profit
Mark B
2
Leute, spart euch etwas Zeit und lest die Antwort von Specur, die hier akzeptiert werden sollte stackoverflow.com/a/4175442/360211
weston

Antworten:

184

Ich bin nicht sicher, ob Sie danach sind, aber versuchen Sie dieses XML:

android:hint="Enter Name"

Dieser Text wird angezeigt, wenn das Eingabefeld leer, ausgewählt oder nicht ausgewählt ist.

Oder wenn Sie möchten, dass es genau so funktioniert, wie Sie es beschrieben haben, weisen Sie dem editText einen onClickListener zu und setzen Sie ihn mit setText () leer.

Specur
quelle
37

Suchen Sie ein ähnliches Verhalten wie das x, das auf der rechten Seite der Textfelder eines iPhones angezeigt wird und das den Text beim Tippen löscht? Dort heißt es clearButtonMode. So erstellen Sie dieselbe Funktionalität in einer Android EditText-Ansicht:

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) {
    }
});
Harris
quelle
1
Und für meine Version dieses Codes, die alle verschiedenen Textfeld-Clearbutton-Optionen implementiert, schauen Sie hier stackoverflow.com/questions/6274021/…
Harris
Das ist absolut großartig. Wenn Sie wie ich bereits ein zusammengesetztes Zeichenelement verwenden (ein Suchzeichen links neben dem Bearbeitungstext), ist eine kleine Bearbeitung zur Unterstützung erforderlich. Ich habe unten eine Version davon als Unterklasse von EditText veröffentlicht.
Carlos P
1
Hinweis: Wenn Ihr Symbol größer als EditText ist und Sie nicht möchten, dass die Größe des EditText beim Hinzufügen von Text oder Text ständig geändert wird, setzen Sie die Zeichen-Alpha je nach Fall auf 0 oder 255
Daiwik Daarun
1
Weitere Hinweise: 1.) Die Lösung von Harris kann mit einem OnFocusChangeListener kombiniert werden, sodass das Symbol nur angezeigt wird, wenn der EditText gerade bearbeitet wird. 2.) Die Bedingungen des onTouchListener können zu einer Bedingung kombiniert werden (etwas leichter zu lesen). 3.) Ich habe auch v.playSoundEffect(SoundEffectConstants.CLICK)den onTouchListener hinzugefügt , um akustisches Feedback zu erhalten, wenn der Text entfernt wird.
AustrianDude
In OnTouchListener.onTouch () sollten Sie höchstwahrscheinlich "true" zurückgeben, wenn Sie das Feld löschen.
Nordmann
28

Nach einem Klick auf eine Aktion führen Sie den folgenden Schritt aus

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

oder

Schreiben Sie dies in eine XML-Datei

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

Es funktioniert gut für mich. Hoffe euch allen.

Rahul Baradia
quelle
1
Die einfachste und genauere Antwort. Vielen Dank!
Luigi Siri
21

das heißt hinweis in android benutze android: Hinweis = "Name eingeben"

Yash Patil
quelle
19

Die Antwort von @ Harris ist großartig. Ich habe sie als separate Unterklasse von EditText implementiert. Dies kann die Verwendung vereinfachen, wenn Ihr Code bereits TextChangedListeners hinzufügt.

Außerdem habe ich es so angepasst, dass wenn Sie bereits zusammengesetzte Drawables verwenden, diese intakt bleiben.

Code ist hier für alle, die ihn brauchen:

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

}
Carlos P.
quelle
1
In OnTouchListener.onTouch () sollten Sie "true" zurückgeben, wenn Sie das Feld löschen. Dies zeigt an, dass Sie das Ereignis gemäß der OnTouchListener-Spezifikation konsumiert haben.
Nordmann
16

Wenn Sie Text im Bearbeitungstext haben und ihn wie gesagt entfernen möchten, versuchen Sie Folgendes:

    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("");
                }
            }
        }
    });
Scoobler
quelle
Gute Antwort! Übrigens können Sie einfach sagen, ob (hasFocus) anstatt zu sagen, ob (hasFocus == true) :)
rizalp1
5

Seien Sie vorsichtig, wenn Sie Text mit einem onClick-Listener in dem Feld festlegen, in dem Sie den Text festlegen. Ich habe dies getan und den Text auf eine leere Zeichenfolge gesetzt. Dies führte dazu, dass der Zeiger nach oben zeigte, wo sich mein Cursor befand, der normalerweise nach einigen Sekunden verschwindet. Wenn ich nicht darauf gewartet habe, dass es verschwindet, bevor ich meine Seite verlasse, wodurch finish () aufgerufen wird, würde dies einen Speicherverlust verursachen und meine App zum Absturz bringen. Ich habe eine Weile gebraucht, um herauszufinden, was den Absturz in diesem Fall verursacht hat.

Auf jeden Fall würde ich empfehlen, selectAll () in Ihrem On-Click-Listener anstelle von setText () zu verwenden, wenn Sie können. Auf diese Weise kann der Benutzer nach Auswahl des Textes mit der Eingabe beginnen und der gesamte vorherige Text wird gelöscht.

Bild des verdächtigen Zeigers: http://i.stack.imgur.com/juJnt.png

andymal
quelle
3

// Zum Löschen, wenn auf die Schaltfläche Löschen geklickt wird

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

Dies hilft dabei, die falschen Schlüsselwörter zu löschen, die Sie eingegeben haben. Anstatt immer wieder die Rücktaste zu drücken, können Sie einfach auf die Schaltfläche klicken, um alles zu löschen. Es hat bei mir funktioniert. Ich hoffe es hilft

ashim888
quelle
1
Einfach es funktioniert .. Danke
STS
1

Code zum Löschen des Textfelds beim Klicken

<EditText android:onClick="TextFieldClicked"/>

public void TextFieldClicked(View view){      
      if(view.getId()==R.id.editText1);
           text.setText("");    
}
kazi titu
quelle
0
((EditText) findViewById(R.id.User)).setText("");
((EditText) findViewById(R.id.Password)).setText("");
Dileep
quelle
0

Für mich der einfachste Weg ... Erstellen Sie einen öffentlichen EditText, zum Beispiel "myEditText1"

public EditText myEditText1;

Verbinden Sie es dann mit dem EditText, der gelöscht werden soll

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

Erstellen Sie danach eine Leere, die auf einen Klick auf den EditText reagiert, und lassen Sie ihn beispielsweise den darin enthaltenen Text löschen, wenn er fokussiert ist

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

        }
    }

Hoffe ich könnte dir helfen, wünsche allen einen schönen Tag

Joki-9
quelle