431 Stimmen

Android: EditText zum Entfernen des Fokus zwingen?

Ich möchte in der Lage sein, den Fokus vom EditText zu entfernen. Wenn zum Beispiel die Tastatur erscheint und der Benutzer sie mit der Zurück-Taste ausblendet, möchte ich, dass der Fokus und der Cursor verschwinden. Wie lässt sich das bewerkstelligen?

0 Stimmen

Gibt es eine andere Ansicht, die nach EditText fokussiert werden kann?

0 Stimmen

Ist es möglich, eine WebView zu fokussieren?

0 Stimmen

Siehe meine Antwort hier: stackoverflow.com/questions/3890033/

21voto

Mohamed Hussien Punkte 1064

Müssen Sie entfernen <requestFocus/>

wenn Sie es nicht benutzen und trotzdem das gleiche Problem haben

Benutzer LinearLayout als Elternteil und setzen

android:focusable="true"
android:focusableInTouchMode="true"

Ich hoffe, es hat Ihnen geholfen.

11voto

zed Punkte 183

Dies ist meine allererste Antwort auf SO, also seid nicht zu streng mit mir, wenn ich Fehler habe :D

Es gibt nur wenige Antworten im SO, aber ich habe das Bedürfnis, meine vollständige Lösung zu posten, weil mich das verrückt gemacht hat. Ich habe Teile und Stücke von überall her zusammengeklaubt, also verzeiht mir, wenn ich nicht jedem die entsprechende Anerkennung zuteil werden lasse... :)

(Ich werde mein Ergebnis vereinfachen, weil meine Ansicht zu viele Elemente hat und ich nicht damit spammen will und versuchen werde, sie so allgemein wie möglich zu gestalten...)

Für Ihr Layout benötigen Sie ein Elternteil Ihr EditText et übergeordnete Ansicht etwa so definiert:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
              android:orientation="vertical"
              android:layout_width="match_parent" 
              android:layout_height="match_parent"
              android:id="@+id/lytContainer"
              android:descendantFocusability="beforeDescendants"
              android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent" 
              android:layout_height="wrap_content" 
              android:id="@+id/etEditor"
              android:inputType="number"
              android:layout_gravity="center" 
              android:hint="@string/enter_your_text"
              android:textColor="@android:color/darker_gray" 
              android:textSize="12dp"
              android:textAlignment="center" 
              android:gravity="center" 
              android:clickable="true"/>
</LinearLayout>

Ich brauchte also ein paar Dinge hier. Ich brauchte einen Platzhalter für meinen EditText - das ist das -.

Android:hint="hint"

Auch,

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

machte es möglich für EditText nicht auf den Eintritt in die Tätigkeit und später in der Tätigkeit selbst bei der Einstellung hilft diese Einstellung, damit Sie die onTouchListener darauf, um den Fokus weg von EditText .

Jetzt, in der Aktivität:

package com.at.keyboardhide;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA", "text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}

Ein paar der Antworten für Bits habe ich auf dieser Frageseite gefunden, und den Teil mit der Activity-Lösung habe ich auf dieser Blog . Der Rest, den ich vermisste und den ich selbst herausfinden musste, war der klare Fokus auf die EditText die ich sowohl innerhalb der setOnEditorActionListener und onTouchLister für die übergeordnete Ansicht .

Ich hoffe, das hilft jemandem und spart ihm Zeit :)

Zum Wohl, Z.

6voto

Nikola Despotoski Punkte 48592

In den Kommentaren haben Sie gefragt, ob eine andere Ansicht anstelle des EditTextes fokussiert werden kann. Ja, das ist möglich. Verwenden Sie .requestFocus() Methode für die Ansicht, die am Anfang fokussiert werden soll (in der onCreate()-Methode)

Auch die Fokussierung einer anderen Ansicht spart einiges an Code. (Code für das Ausblenden der Tastatur zum Beispiel)

5voto

Pixtar Punkte 241

Ich hatte das gleiche Problem. Es hat mich mehr als verrückt gemacht.

Ich hatte einen erweiterten Dialog mit einem ScrollView, der ein TableLayout mit erweitertem LinearLayout hatte, das eine SeekBar und einen EditText enthielt.

Der erste EditText hatte nach dem Anzeigen des Dialogs immer den Autofokus und nach dem Beenden der Bearbeitung des Textes über die Tastatur hatte der EditText immer noch den Fokus und die Tastatur war immer noch sichtbar.

Ich habe fast alle Lösungen in diesem Thread ausprobiert, aber keine hat bei mir funktioniert.

Hier also mein einfache Lösung : (Text = EditText)

text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});

Übrigens, ich hat nicht einen der folgenden Schnipsel zur Lösung des Problems verwendet:

//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

UND I hat nicht ein Abstandselement wie eine Ansicht mit einer Breite und Höhe von 1dp verwendet.

Hoffentlich hilft es jemandem :D

3voto

Sie können auch Folgendes einschließen android:windowSoftInputMode="stateAlwaysHidden" in Ihrem Aktionsabschnitt des Manifests.

Dies ist gleichbedeutend mit:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X