2012-12-20 16 views
17

In meiner Tätigkeit habe ich ein editText Feld. Wenn der Benutzer darauf tippt, erhält der editText den Fokus und die Tastatur erscheint. Wenn nun der Benutzer die Hardware-Zurück-Taste am Telefon drückt, verschwindet die Tastatur, aber der Cursor bleibt im Editiertext, d. e., es hat immer noch den Fokus. Ist es möglich, EditText den Fokus zu verlieren, wenn die Zurück-Taste gedrückt wird? Ich habe versucht, den folgenden Code verwenden, aber es hat nicht funktioniert:make editText verlieren Fokus auf zurück drücken

@Override 
public void onBackPressed() { 
    vibrator.vibrate(Constants.DEFAULT_VIBRATE_TIME); 
    myEditText.clearFocus(); 
      super.onBackPressed(); 
} 
+1

Stellen Sie sicher, dass myEditText nicht das erste Eingabeelement in Ihrem Layout ist. Wenn ja, dann entfernen Sie Focus von EditText und dann den Fokus auf jedes andere Element wie TextView usw. –

+0

Es war das erste Eingabeelement in meiner Aktivität. Ich habe versucht, 'title.requestFocus()', aber es hat nicht funktioniert – Ankush

+0

ersten make Titel fokussierbarem dann title.requestFocus() aufrufen –

Antwort

2

Sie können andere Ihrer Views fokussierbar machen, zum Beispiel ein ImageView. Stellen Sie sicher, dass es im Berührungsmodus fokussierbar ist, indem Sie setFocusableInTouchMode(true) verwenden und unter onResume() diese View zu requestFocus() machen.

Sie können auch einen Dummy View mit 0 Dimensionen erstellen und die oben beschriebenen Schritte ausführen.

Ich hoffe, das hilft.

+4

riecht wie ein hack ... –

+0

onresume wird nicht ausgelöst, wenn Tastatur schließt – PrisonMike

0

Add Ansicht wie folgt höher ist als Ihre EditText:

<LinearLayout 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:focusable="true" 
    android:focusableInTouchMode="true" /> 

Auch Tastatur fügen Sie diese in onBackPressed zu verstecken():

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 
11

einfach erweitern EditText:

public class EditTextV2 extends EditText 
{ 
    public EditTextV2(Context context) 
    { 
     super(context); 
    } 

    public EditTextV2(Context context, AttributeSet attribute_set) 
    { 
     super(context, attribute_set); 
    } 

    public EditTextV2(Context context, AttributeSet attribute_set, int def_style_attribute) 
    { 
     super(context, attribute_set, def_style_attribute); 
    } 

    @Override 
    public boolean onKeyPreIme(int key_code, KeyEvent event) 
    { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
      this.clearFocus(); 

     return super.onKeyPreIme(key_code, event); 
    } 
} 

Und in der XML-Datei verwenden Sie einfach <yourPackage.EditTextV2> anstelle von <EditText>.

Hinweis: Je nach der von Ihnen unterstützten Mindest-API müssen Sie möglicherweise Konstruktoren zu dieser Klasse hinzufügen/entfernen. Ich schlage vor, sie alle hinzuzufügen und diejenigen zu entfernen, deren super() Anrufe rot unterstrichen werden.

+0

Wenn wir den Konstruktor verwenden: 'EditText (Kontextkontext, AttributSet attrs, int defStyleAttr, int defStyleRes) 'minimale API-Anforderung ist 21 [EditText] (https://developer.android.com/reference/android/widget/EditText.html) – ArtiomLK

+1

Perfekt elegante Lösung. Dies ist nützlich, wenn Sie das Verhalten der Zurückschaltfläche mithilfe von Fragmenten über "View.OnKeyListener" überschreiben müssen und ein Back-Button-Klickereignis erfassen müssen, während ein Fokus-stehlender EditText Ihre Implementierung unterbricht. Prost! – mwieczorek