So zeigen Sie eine Softtastatur an, wenn edittext fokussiert ist

461

Ich möchte die Soft-Tastatur automatisch anzeigen, wenn eine EditTextfokussiert ist (wenn das Gerät keine physische Tastatur hat), und ich habe zwei Probleme:

  1. Wenn my Activityangezeigt wird, ist my EditTextfokussiert, aber die Tastatur wird nicht angezeigt. Ich muss erneut darauf klicken, um die Tastatur anzuzeigen (sie sollte angezeigt werden, wenn my Activityangezeigt wird).

  2. Und wenn ich auf der Tastatur auf Fertig klicke, wird die Tastatur nicht angezeigt, aber die Tastatur EditTextbleibt fokussiert und ich möchte nicht (weil meine Bearbeitung abgeschlossen ist).

Um fortzufahren, ist mein Problem, etwas ähnlicheres auf dem iPhone zu haben: das die Tastatur mit meinem EditTextStatus synchronisiert (fokussiert / nicht fokussiert) und natürlich keine Softtastatur präsentiert, wenn es eine physische gibt.

Ludovic Landry
quelle
Ich habe nur einen grundlegenden EditText wie: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> Und bei meiner Aktivität habe ich this: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry
2
Dies half mir besser als jede Antwort in diesem Beitrag: stackoverflow.com/a/2418314/1491212
Armel Larcier

Antworten:

628

Um das Erscheinen der Softtastatur zu erzwingen, können Sie verwenden

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

Und um den Fokus zu entfernen EditText, benötigen Sie leider einen DummyView , um den Fokus zu erhalten.

ich hoffe das hilft


Zum Schließen können Sie verwenden

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Dies funktioniert für die Verwendung in einem Dialogfeld

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
Raukodraug
quelle
2
Wenn ich das mache, wird die Softtastatur angezeigt, wenn die Aktivität angezeigt wird (es ist gut), aber wenn mein Fokus den EditText verlässt und zum Beispiel zu einer Schaltfläche geht, bleibt die Tastatur (das ist schlecht).
Ludovic Landry
157
Funktioniert bei mir nicht mit einem EditText in einem Dialog, der bereits den Fokus hat. Nicht sicher warum.
Matthias
10
@AbdellahBenhammou: Wenn Sie möglicherweise einen requestFocus-Aufruf für Ihren Bearbeitungstext ausführen, bevor die weiche Eingabe angezeigt wird, kann dies Ihr Problem lösen. Es hat für mich getan.
r1k0
18
@AbdellahBenhammou, tun Sie dies in onCreate () Ihres DialogFragments: getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip
22
Arbeitete nur in Verbindung mit yourEditText.requestFocus()wie hier beschrieben: stackoverflow.com/questions/8991522/…
Vivek Pandey
231

Ich hatte das gleiche Problem. Unmittelbar nach dem Wechsel von editText VISIBILITY von GONE zu VISIBLE musste ich den Fokus einstellen und die Softtastatur anzeigen. Ich habe dies mit dem folgenden Code erreicht:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Es funktioniert bei mir mit einer Verzögerung von 100 ms, ist jedoch ohne Verzögerung oder nur mit einer Verzögerung von 1 ms fehlgeschlagen.

Der kommentierte Teil des Codes zeigt einen anderen Ansatz, der nur auf einigen Geräten funktioniert. Ich habe auf den Betriebssystemversionen 2.2 (Emulator), 2.2.1 (echtes Gerät) und 1.6 (Emulator) getestet.

Dieser Ansatz ersparte mir viel Schmerz.

Mike Keskinov
quelle
48
Ich wusste nicht, dass etwas gleichzeitig so hässlich und so schön sein kann. Ich danke dir sehr!
Mkerley
15
@jellyfish dies simuliert einen Tipp auf die EditText. Für andere, die dies lesen, können Sie anstelle eines neuen Handlerauch die View.postDelayed()Methode im yourEditTextWidget selbst verwenden.
Tony Chan
5
Dies ist eine viel bessere Lösung von David Chandler.
Ben Bederson
4
Wenn die Lösung von David Chandler auf allen Android-Versionen / Geräten funktioniert und für den Fall, dass VISIBILITY gerade von GONE auf VISIBLE geändert wurde, JA - sollten Sie stattdessen seine Lösung verwenden.
Mike Keskinov
3
Einverstanden. Kennen Sie eine bessere Lösung, die für alle Android-Varianten geeignet ist?
Mike Keskinov
162

Verwenden Sie, um die Tastatur anzuzeigen

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Diese Methode ist zuverlässiger als das direkte Aufrufen des InputMethodManager.

Verwenden Sie zum Schließen die Option

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
David Chandler
quelle
12
Kann jemand bitte erklären, warum dies zuverlässiger ist als das direkte Aufrufen InputMethodManager? (Zum einen funktioniert es nicht, im Gegensatz zu Raukodraugs Lösung.)
Matthew Quiros
5
Funktioniert auch bei mir nicht. Arbeiten in Android 2.3.5. Die Lösung von raukodraug funktioniert bei mir. Nach Versionsabhängigkeit gesucht, aber keine gefunden.
Hugo Logmans
2
Dies funktionierte bei mir in Android 4.4.2. Die als Lösung für diesen Beitrag ausgewählte InputMethodManager-Methode hat bei mir nicht funktioniert.
Phil
Nachdem ich die Methode in der Antwort verwendet hatte, fügte ich diese hinzu und es funktionierte, aber ohne sie funktionierte es nicht. Danke
Manny265
2
Hat bei mir in Android 4.4.2 nicht funktioniert. Es zeigt die Tastatur, hat sie aber nicht ausgeblendet.
John J Smith
87

Wenn nichts anderes funktioniert, erzwingen Sie die Anzeige :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

Und später, wenn Sie es schließen möchten, beispielsweise in onPause (), können Sie Folgendes aufrufen:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Bolling
quelle
4
Du hattest recht, @Bolling! Wenn nichts anderes funktioniert hat, hat mich Ihr Code gerettet. Vielen Dank!
Willian Paixao
3
Ihr Code war der einzige, der für mich gearbeitet hat, und ich habe jede Lösung auf dieser Seite ausprobiert! Vielen Dank!
Mattia Ruggiero
4
erzwinge es nicht. In einigen Fällen bleibt die Tastatur dort, wenn Sie vom Vordergrund zum Hintergrund wechseln, da Sie sie erzwungen haben. Es ist ein Fragmentierungsproblem, aber ich habe es auf Samsung Duos gesehen.
j2emanue
Normalerweise habe ich immer Code zum Schließen der Tastatur bei Pause (), da ich gesehen habe, dass sie hängen bleibt, auch wenn Sie sie nicht erzwungen haben.
Bolling
Das hat funktioniert, aber wenn Sie zu den anderen Bildschirmen wechseln, bleibt es immer noch offen
Sithu
75

Der folgende Code stammt aus dem 4.1-Quellcode von Google für SearchView. Scheint zu funktionieren, auch bei kleineren Android-Versionen.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Außerdem muss beim Erstellen der Steuerung / Aktivität der folgende Code hinzugefügt werden. (In meinem Fall handelt es sich eher um ein zusammengesetztes Steuerelement als um eine Aktivität).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});
Robin Davies
quelle
Vielen Dank! Es funktioniert erstaunlich gut. Und es ist die Lösung, mit der ich mich aus all den Antworten und Themen, die ich zu diesem Thema gelesen habe, besser auskenne.
Rui
37
:-D setImeVisibility(hasFocus)?
Matthias
Ich habe diese Methode ausprobiert, da ich tatsächlich "meine eigene Suchansicht rollte" (wollte das nicht tun müssen, aber es gab Gründe). Dies funktionierte für mich bis auf den Start der Aktivität. Ich habe android: windowSoftInputMode = "alwaysVisible" zur Aktivität hinzugefügt und bereits requestFocus () für den Bearbeitungstext aufgerufen. Funktioniert wie ein Champion.
javahead76
Irgendeine Idee die Notwendigkeit von removeCallbacks (mShowImeRunnable)? Ich dachte, sobald die ausführbare Datei ausgewählt ist, um aus der Warteschlange ausgeführt zu werden, wird sie gleichzeitig aus der Warteschlange entfernt.
Cheok Yan Cheng
1
Nachdem ich mehrere Variationen ausprobiert hatte, war dies die einzige, die für mich konsistent funktionierte (Android 4.42). Thx
John J Smith
34

android:windowSoftInputMode="stateAlwaysVisible" -> in Manifestdatei.

edittext.requestFocus(); -> im Code.

Dadurch wird die Softtastatur geöffnet, auf der der Bearbeitungstext den Anforderungsfokus hat, wenn die Aktivität angezeigt wird.

gorenikhil33
quelle
2
Dies öffnet die Tastatur bei der Aktivitätserstellung.
bis zum
beantwortet die Frage nicht, hat mir aber geholfen :)
S.Thiongane
öffnet Schlüssel ohne Requestfocus in API 22
David
Funktioniert gut für meinen Fall. Ich frage mich, warum das Anforderungsfokusattribut nur aus der XML ebenfalls erwähnt werden muss manifest!
Sud007
30

Ich hatte in letzter Zeit in einigen einfachen Fällen Glück mit dem folgenden Code. Ich habe noch nicht alle Tests beendet, aber ...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Und schon wird die Tastatur angezeigt.

Delle
quelle
Für meinen Fall hatte ich eine Schaltfläche, um einige optionale Informationen hinzuzufügen. Im button.onClick-Handler wurde der obige Code hinzugefügt, um zu erzwingen, dass die Softtastatur für die Eingabe der optionalen Informationen angezeigt wird. Droid 2.2.2
Dent
Dies ist eine gute Lösung, aber vergessen Sie nicht, dass Sie ein MotionEvent-Objekt erstellen und nach der Verwendung recycle () aufrufen sollten, um es von einem späteren Aufrufer wiederzuverwenden.
Jimbob
Sie brauchen nur ein dispatchTouchEvent () mit ACTION_UP als Argument.
Mohammed Junaid
15

Sie können versuchen, das Anzeigen der Softtastatur zu erzwingen. Dies funktioniert bei mir:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Vadim Zin4uk
quelle
1
Das funktioniert bei mir ... Ich hatte versucht, diese InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (name, inputMethodManager.SHOW_IMPLICIT); oder getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); aber keiner von ihnen arbeitete.
Günay Gültekin
10

Manchmal funktioniert die Antwort von Raukodraug nicht. Ich habe es auf diese Weise mit einigen Versuchen und Fehlern gemacht:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

Und der EditText- Teil:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });
Xieyi
quelle
1
Dies ist die einzige Lösung, die für mich auf Android 5
funktioniert hat
10

Verwenden Sie diese Option, um die Tastatur auszublenden:

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

und Tastatur zu zeigen:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mubashar
quelle
Für ein DialogFragment können Sie dies in einem überschriebenen Format aufrufen onStart()und getDialog().getWindow()als Alternative zu verwenden getActivity().getWindow().
Mr-IDE
10

Und für Kotlin verwenden Sie einfach diese Erweiterungen:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}
Bitvale
quelle
genau das, wonach ich gesucht habe.
lasec0203
8

Stellen Sie sicher, dass das Fragment funktioniert:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Arish Khan
quelle
7

showSoftInput arbeitete überhaupt nicht für mich.

Ich dachte, ich müsste den Eingabemodus einstellen: (hier in der Aktivitätskomponente im Manifest)

android:windowSoftInputMode="stateVisible" 
vincebodi
quelle
6

Ob Sie es glauben oder nicht, mein Problem mit der Soft-Tastatur wurde behoben, als ich feststellte, dass die Animationen für Aktivitäten die Soft-Tastatur deaktivieren können. Wenn Sie die Absicht mit dem anrufen

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

und

overridePendingTransition(0, 0);

Es kann die Soft-Tastatur ausblenden und es gibt keine Möglichkeit, sie anzuzeigen.

Sparkbit
quelle
6

Ich hatte das gleiche Problem in verschiedenen Situationen, und die Lösungen, die ich gefunden habe, funktionieren in einigen, funktionieren aber in anderen nicht. Hier ist eine kombinierte Lösung, die in den meisten Situationen funktioniert, die ich gefunden habe:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}
n0sferat0k
quelle
6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
Gast
quelle
6

Ich habe hier alles kombiniert und für mich funktioniert es:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
lxknvlk
quelle
6

Es hat bei mir funktioniert. Sie können damit auch versuchen, die Tastatur anzuzeigen:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Tarit Ray
quelle
5

Code-Auszug . . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}
Jongz Puangput
quelle
5

Kotlin Erweiterung zum Anzeigen der Tastatur im Fokus.

Dies ist eine Kombination früherer Antworten, die entweder zu lang oder unvollständig waren.

Diese Erweiterung stellt eine ausführbare Datei in der Nachrichtenwarteschlange bereit, die nach Anforderung des Fokus die Softtastatur anzeigt:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Rufen Sie es bei Bedarf aus einer beliebigen Ansicht auf:

editText.showSoftKeyboard()
Alex Burdusel
quelle
4

füge einfach android hinzu: windowSoftInputMode = "stateHidden" in der Manifestdatei ...

Prakash Gavade
quelle
4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
XXX
quelle
4

In Ihrem Manifest:

android:windowSoftInputMode="stateAlwaysVisible"- ursprünglich gestartete Tastatur. android:windowSoftInputMode="stateAlwaysHidden" - zunächst versteckte Tastatur.

Ich benutze es auch gerne, "adjustPan"weil sich der Bildschirm beim Starten der Tastatur automatisch anpasst.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
Md Imran Choudhury
quelle
4

Fügen Sie einfach diese Zeile in Ihre EditText-Ansicht ein:

android:isScrollContainer="true"

und TADA - Tastatur wurde automatisch angezeigt!

Ich hatte ein ähnliches Problem und entdeckte diese einfache und seltsame Lösung.

Wie hier bereits von user3392439 erwähnt, ist das Erscheinen der Tastatur beim Fokussieren irgendwie seltsam mit der Anwesenheit der Bildlaufkomponente in der XML-Datei verbunden.

Selbst wenn eine andere EditText-Ansicht vorhanden ist, die eine der oben genannten Zeilen in demselben XML enthält, wird die Tastatur angezeigt, unabhängig davon, auf welche EditTexts-Version gerade fokussiert ist.

Wenn Ihre XML-Datei mindestens eine sichtbare Ansicht mit einer Bildlaufkomponente enthält, wird die Tastatur automatisch im Fokus angezeigt.

Wenn kein Bildlauf erfolgt, müssen Sie auf EditText klicken, damit die Tastatur angezeigt wird.

Waldmann
quelle
Das ist sehr seltsam , aber es funktioniert auf jeden Fall - ich war zu versuchen , requesFocus()aus einem Click - Handler , und dies ist die einzige Möglichkeit , andere als eine explizite showSoftInput SHOW_FORCED
zog
Heilige Scheiße, danke Mann. Keine Ahnung, warum es funktioniert, aber ich habe es auf 8 Geräten verschiedener Hersteller getestet und es hat jedes Mal funktioniert!
Antonio Vlasic
3

Alle oben angegebenen Lösungen ( InputMethodManager- Interaktion im OnFocusChangeListener.onFocusChange- Listener, der an Ihren EditText angehängt ist funktioniert wenn Sie eine einzelne Bearbeitung in der Aktivität haben.

In meinem Fall habe ich zwei Änderungen.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Ich habe beobachtet, dass onFocusChange für tvX mit hasFocus = true (Tastatur gezeigt) ausgelöst wird, dann aber für tvY mit hasFocus = true (Tastatur ausgeblendet). Am Ende war keine Tastatur sichtbar.

Die allgemeine Lösung sollte die richtige Aussage enthalten, wenn "Tastatur anzeigen, wenn EditText-Text den Fokus hat".

Bartosz Bilicki
quelle
3

In Ihrem Abschnitt onResume () der Aktivität können Sie die Methode bringKeyboard () aufrufen.

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }
Vikas
quelle
Was ist das WidgetUtils.showKeyboard? Das ist hier das Wichtigste.
TWiStErRob
2

Keine der Antworten hat bei mir funktioniert. Hier ist ein einfacher Weg.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Ich habe gerade die requestFocus () -Methode um 400 ms verzögert.

Satyajit Das
quelle
Vielen Dank, es braucht etwas Verzögerung für die Tastatur, die ...
hkh114
1

Ich habe ein seltsames Verhalten festgestellt, da in einer meiner Apps die Softtastatur beim Aufrufen der Aktivität automatisch angezeigt wurde (in onCreate befindet sich eine editText.requestFocus ()).

Beim weiteren Graben stellte ich fest, dass dies daran liegt, dass sich um das Layout eine ScrollView befindet. Wenn ich die ScrollView entferne, ist das Verhalten wie in der ursprünglichen Problembeschreibung beschrieben: Nur beim Klicken auf den bereits fokussierten editText wird die Softtastatur angezeigt.

Wenn es bei Ihnen nicht funktioniert, versuchen Sie es mit einer ScrollView - es ist sowieso harmlos.

user3392439
quelle
1

Ich hatte ein ähnliches Problem bei der Verwendung von Ansichtsanimationen . Daher habe ich einen Animations-Listener eingerichtet, um sicherzustellen, dass ich auf das Ende der Animation warte, bevor ich versuche, einen Tastaturzugriff auf den angezeigten Edittext anzufordern.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
Benjamin Piette
quelle
1

Ich bin damit einverstanden, dass Raukodraug dafür in einer Swithview verwendet wird, die Sie wie folgt anfordern / klar fokussieren müssen:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Grüße.

Jean-Luc Barat
quelle