web-dev-qa-db-ger.com

Tippen Sie außerhalb von Edittext, um den Fokus zu verlieren

Ich möchte nur beim Klicken außerhalb des "Edittext" automatisch den Fokus verlieren und die Tastatur ausblenden. Im Moment, wenn ich auf den "Edittext" klicke, wird der Fokus eingestellt, aber ich muss die Zurück-Taste drücken, um die Unschärfe einzustellen. 

35
JustCurious

@woodshy hat die Antwort für das Ausblenden der Tastatur, aber das Einfügen des Codes in onClick ist nicht so gut wie das Einfügen in onFocusChanged. Damit erzwungen wird, den Fokus zu verlieren, müssen Sie das Objekt, auf das Sie den Fokus übertragen möchten, in seiner XML-Datei festlegen: 

Android:focusable="true"
Android:focusableInTouchMode ="true"
18
lynnyilu

Um dieses Problem zu lösen, verwenden Sie zunächst setOnFocusChangeListener dieses Edittext 

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    Log.d("focus", "focus loosed");
                    // Do whatever you want here
                } else {
                    Log.d("focus", "focused");
                }
            }
        });

und dann müssen Sie dispatchTouchEvent in der Aktivität überschreiben, die den Edittext-Code enthält

@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    Log.d("focus", "touchevent");
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }

Wenn nun ein Benutzer nach außen klickt, wird zuerst dieses dispatchTouchEvent aufgerufen, wodurch der Fokus vom Editext gelöscht wird. Jetzt wird Ihr OnFocusChangeListener aufgerufen, der Fokus wurde geändert. Jetzt können Sie alles tun, was Sie tun wollten , hoffe, es funktioniert :)

17
Sudhanshu Gaur

Angenommen, Ihr EditText befindet sich im linearen Layout oder einer anderen ViewGroup. Dann sollten Sie diesen Container anklickbar, fokussierbar und fokussierbarInTouchMode machen. Danach setzen Sie onClickListener auf diesen Container mit folgendem Code in der Methode onClick Override: 

@Override
public void onClick(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
14
woodshy

Ich suchte also ein bisschen herum und keine andere Lösung war genau das, wonach ich suchte. Meiner Meinung nach verhält sich der Fokus auf EditText-Ansichten merkwürdig.

Was ich getan habe war ...

  1. Stellen Sie sicher, dass die Stammansicht ein RelativeLayout ist

  2. Fügen Sie ein Overlay-Layout hinzu, das über dem Bereich liegt, in dem die Tastatur nicht mehr angezeigt wird, nicht jedoch den EditText. Etwas wie unten:

In meinem Fall befand sich der EditText in einem Container am unteren Rand des Bildschirms. so umfasste es alles andere.

  1. Haben Sie eine Methode, die ein bisschen wie diese aussieht:
 private void hideKeyboard () {
 final InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow (editText.getWindowToken (), 0); 
 keyboardOverlay.setVisibility (View.GONE); 
 editText.clearFocus (); 
 } 
  1. Rufen Sie diese Methode jetzt beim onClick der erstellten Überlagerung auf.

  2. Jetzt wollen wir die Überlagerung sichtbar machen, wenn Sie auf den EditText drücken. Sie können das onFocus-Ereignis nicht verwenden (zumindest habe ich es nicht zum Laufen gebracht ...) Also habe ich stattdessen das onTouch-Ereignis verwaltet.

 editText.setOnTouchListener (neuer OnTouchListener () {

 @Override 
 public boolean onTouch (abschließendes View v, endgültiges MotionEvent-Ereignis) {
 keyboardOverlay.setVisibility (View.VISIBLE); .__; . editText.requestFocus (); 
 return false; 
} 
}); 

RequestFocus () dient dazu, das Fokusereignis mit dem onTouch nicht zu überschreiben.

Wenn Sie dies ausprobieren, können Sie dem Overlay eine Hintergrundfarbe hinzufügen, um genau zu sehen, was passiert.

Ich hoffe es funktioniert für Sie!

1
Charles

Sie können dies durch folgende Schritte erreichen:

1. Machen Sie die übergeordnete Ansicht (Inhaltsansicht Ihrer Aktivität) anklickbar und fokussierbar, indem Sie die folgenden Attribute hinzufügen

    Android:clickable="true" 
    Android:focusableInTouchMode="true" 

2.Implementieren Sie eine hideKeyboard () -Methode

    public void hideKeyboard(View view) {
        InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

3.Letzten Sie den onFocusChangeListener Ihres Edittext.

    edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(v);
            }
        }
    });
0
Rajul Goel

festlegen in einer Schaltfläche oder einer beliebigen Ansicht: this.getCurrentFocus (). clearFocus (); Beispiel:

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    this.getCurrentFocus().clearFocus();
    return super.onMenuOpened(featureId, menu);
}
0
nobjta_9x_tq

Der folgende Code funktioniert perfekt für mich und ich verwende diesen regelmäßig zum Schließen des SoftKeyboards onTouch außerhalb des EditText.

public void hideSoftKeyboard()
{
        //Hides the SoftKeyboard
        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}

public void setupUI(View view) 
{
        String s = "inside";
        //Set up touch listener for non-text box views to hide keyboard.
        if (!(view instanceof EditText)) {

            view.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard();
                    return false;
                }

            });        
        }


    //If a layout container, iterate over children and seed recursion.
        if (view instanceof ViewGroup) {

            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

                View innerView = ((ViewGroup) view).getChildAt(i);

                setupUI(innerView);
            }
        }    
}

Sie müssen also nur einmal die Funktion setupUI() in Ihrer onCreate()-Methode und in Ihrer Voilla aufrufen. Ihr hidingSoftKeyboard ist dann eingerichtet!

Für Losing Complete Focus von EditText müssen Sie einfach editText.clearFocus() in Ihrer hideSoftKeyboard () - Funktion ausführen.

0
Kaushik NP