2010-11-13 16 views
63

W systemie Android, w jaki sposób można wyczyścić EditText po kliknięciu?Jak wyczyścić EditText przy kliknięciu?

Np. Jeśli mam EditText z niektórymi znakami, na przykład 'Enter Name', po kliknięciu przez użytkownika znaki te znikają.

+1

Krok 1: Dodaj detektor onClick do EditText Krok 2: W słuchacza, ustaw zawartość EditText na pusty ciąg Krok 3: Profit –

+2

Ludzie , uratuj się som e czas i przeczytaj odpowiedź od Specur, która powinna być zaakceptowaną odpowiedzią tutaj http://stackoverflow.com/a/4175442/360211 – weston

Odpowiedz

178

Nie jestem pewien, czy jesteś po to, ale spróbuj tego XML:

android:hint="Enter Name" 

wyświetla ten tekst, gdy pole wejściowe jest pusta, wybrana lub odznaczone.

Lub jeśli chcesz, aby zrobił dokładnie tak, jak opisałeś, przypisz onClickListener w editText i ustaw go jako pustego za pomocą setText().

+1

android: hint = "Enter Name" działa poprawnie dzięki – Miuranga

+2

Ten jest bardziej poprawny niż post zaznaczony jako odpowiedź ... –

+0

świetnie! :) dzięki – Nevaeh

15

Jeśli chcesz mieć tekst w tekście edytować i usuwać je jak mówisz, spróbuj:

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

Dobra odpowiedź! BTW, możesz po prostu powiedzieć, czy (hasFocus) zamiast powiedzieć, czy (hasFocus == true) :) – rizalp1

35

Szukasz zachowania podobnego do X, który pojawia się na prawej stronie pól tekstowych iPhone, który czyści tekst po stuknięciu? Nazywa się tam clearButtonMode. Oto, jak utworzyć tę samą funkcjonalność w widoku 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

I dla mojej wersji tego kodu, który implementuje wszystkie różne opcje clearfield pola tekstowego, spójrz tutaj http://stackoverflow.com/questions/6274021/implement-uitextfield-properties-in-android/6274228 # 6274228 – Harris

+0

To jest absolutnie wspaniałe. Jeśli, tak jak ja, używasz już złożonego losowania (glifu wyszukiwania po lewej stronie tekstu edycji), wymagana jest niewielka edycja do obsługi. Zamieściłem wersję tego jako podklasę EditText, poniżej. –

+0

Sprawdź również: http://stackoverflow.com/questions/6355096 – yanchenko

19

@ odpowiedź Harrisa jest wielki, I zostały wdrożone go jako odrębnej podklasy EditText, co może sprawić, że łatwiejsze w użyciu, jeśli już kod dodaje TextChangedListeners.

Udoskonaliłem również to, że jeśli już używasz dowolnych złożonych fiszek, pozostawia je w stanie nienaruszonym.

Code jest tutaj dla każdego, kto go potrzebuje:

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

W OnTouchListener.onTouch() powinieneś zwrócić "true" po wyczyszczeniu pola. Oznacza to, że użytkownik wykorzystał zdarzenie zgodnie ze specyfikacją OnTouchListener. – northernman

+0

co byłoby wtedy prawdą lub fałszem @ northernman –

5

podczas ustawiania tekstu za pomocą detektora onClick na polu ustawiasz tekst uważać. Robiłem to i ustawiałem tekst na pusty ciąg. To powodowało, że wskaźnik wskazywał gdzie był mój kursor, który zwykle zniknie po kilku sekundach. Kiedy nie zaczekałem, aż zniknie, zanim opuścisz moją stronę powodując wywołanie funkcji finish(), spowoduje to wyciek pamięci i awarię mojej aplikacji. Zajęło mi trochę czasu, aby dowiedzieć się, co spowodowało awarię na tym ..

W każdym razie, polecam używanie selectAll() w odbiorniku kliknij, a nie setText(), jeśli możesz. W ten sposób, po wybraniu tekstu, użytkownik może zacząć pisać, a cały poprzedni tekst zostanie wyczyszczony.

pic podejrzanego wskaźnika: http://i.stack.imgur.com/juJnt.png

26

po onclick wszelkich działań zrobić poniżej kroku

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

lub

napisać to w pliku XML

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

jego działa poprawnie dla mnie. Mam nadzieję, że wam wszystkim.

+1

Najprostsza i dokładniejsza odpowiedź. Dzięki! –

+1

najprostszy sposób wyczyszczenia pola editext onclick. –

3

// Aby wyczyścić Po kliknięciu przycisku Wyczyść

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

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

Pomoże to usunąć błędne słowa kluczowe, które zostały wpisane w tak zamiast ponowne naciśnięcie klawisza backspace i ponownie można po prostu kliknąć przycisk, aby usunąć everything.It pracował dla mnie. Nadzieja Pomaga

+1

Proste działa. Dzięki – STS

18

że nazywa się wskazówka w android użytku android: hint = "Wprowadź nazwę"

+1

To jest odpowiednia/prawidłowa odpowiedź. – Hanny

1

kod na oczyszczenie pola tekstowego po kliknięciu

<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

dla mnie Najłatwiejszy sposób ... Utwórz publiczny EditText, na przykład "myEditText1"

public EditText myEditText1; 

Następnie połącz go z EditText który powinien dostać rozjaśniająca

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

Po tym, stworzyć pustkę, która reaguje na kliknięcia do EditText niech usunięcia tekstu wewnątrz niego, gdy jego skupiony, dla przykładu

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

     } 
    } 

nadzieję, że mogłoby pomóc, Miłego dnia wszystkim