2012-05-16 4 views
113

Devo catturare quando un EditText perde la messa a fuoco, ho cercato altre domande ma non ho trovato risposta.Come posso sapere quando un EditText perde l'attenzione?

Ho usato OnFocusChangeListener come questo

OnFocusChangeListener foco = new OnFocusChangeListener() { 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     // TODO Auto-generated method stub 

    } 
}; 

Ma, non funziona per me.

risposta

257

Implementare onFocusChange di setOnFocusChangeListener e c'è un parametro booleano per hasFocus. Quando questo è falso, hai perso la concentrazione su un altro controllo.

EditText txtEdit = (EditText) findViewById(R.id.edittxt); 

txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {   
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       // code to execute when EditText loses focus 
      } 
     } 
    }); 
+15

+1 - ma vale la pena notare che se la modifica del testo è in una lista, ogni premuto il tasto si tradurrà nella casella di perdere e ottenere attenzione. Vedi questa soluzione per tenere traccia della casella attualmente focalizzata: http://stackoverflow.com/questions/9527067/android-edittext-in-listview-loses-focus-on-calling-notifydatachanged – bsautner

+13

41 upvotes per una risposta che dice sostanzialmente "leggi il valore 'hasFocus'". La verità è che questo è veramente difficile da far perdere a editText il focus e ci sono tonnellate di domande senza risposta a riguardo. –

+0

Dove posso aggiungere il codice che mostri? Se lo metto così com'è in "onCreate", l'app si arresta in modo anomalo – Jona

6

avere il vostro Activity implementare OnFocusChangeListener() se si desidera un uso fattorizzata di questa interfaccia, esempio:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{ 

Nel vostro OnCreate è possibile aggiungere un listener per esempio

editTextReaserch.setOnFocusChangeListener(this); 
editTextMyWords.setOnFocusChangeListener(this); 
editTextPhone.setOnFocusChangeListener(this); 

quindi Android Studio ti chiederà di aggiungere il metodo dall'interfaccia, accettalo ... i t sarà come:

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
// todo your code here... 
} 

e come hai un codice fattorizzata, ti basta avere a che fare:

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if (hasFocus) { 
     editTextReaserch.setText(""); 
     editTextMyWords.setText(""); 
     editTextPhone.setText(""); 
    } 
    if (!hasFocus){ 
     editTextReaserch.setText("BlaBlaBla"); 
     editTextMyWords.setText(" One Two Tree!"); 
     editTextPhone.setText("\"your phone here:\""); 
    } 
} 

tutto quello che il codice nel !hasFocus è per il comportamento del oggetto che perde attenzione, che dovrebbe fare il trucco! Ma attenzione che in tale stato, il cambiamento di messa a fuoco potrebbe sovrascrivere le voci dell'utente!

0

Il suo corretto funzionamento

EditText et_mobile= (EditText) findViewById(R.id.edittxt); 

et_mobile.setOnFocusChangeListener(new OnFocusChangeListener() {   
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       // code to execute when EditText loses focus 
if (et_mobile.getText().toString().trim().length() == 0) { 
         CommonMethod.showAlert("Please enter name", FeedbackSubmtActivity.this); 
        } 
      } 
     } 
    }); 



public static void showAlert(String message, Activity context) { 

    final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setMessage(message).setCancelable(false) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 

       } 
      }); 
    try { 
     builder.show(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}