Wie kann ich den Fokus (und die Tastatur anzeigen) programmgesteuert auf meinem EditText einstellen?


179

Ich habe ein Layout, das einige Ansichten wie diese enthält:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

Wie kann ich den Fokus (Anzeige der Tastatur) EditTextprogrammgesteuert einstellen ?

Ich habe es versucht und es funktioniert nur, wenn ich es Activitynormal starte, aber wenn ich es in a TabHoststarte, funktioniert es nicht.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Antworten:


352

Versuche dies:

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

http://developer.android.com/reference/android/view/View.html#requestFocus ()


Aktualisiert mit Code, um die Tastatur zu zwingen, diese Antwort anzuzeigen
David Merriman

5
Es funktioniert nur, wenn ich meine Aktivität normal starte, aber wenn ich meine Aktivität auf einem TabHost starte, funktioniert es nicht.
Houcine

27
Das funktioniert nicht. Dieser funktioniert für mich InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin

5
"Das funktioniert nicht, Bruder". In einigen Fällen müssen Sie diesen Code asynchron von postDelayed () aus aufrufen. Ich hatte einen Fall, in dem ich die Tastatur öffnen musste, nachdem der Benutzer im Dialogfeld "OK" gedrückt hatte. Und als der Dialog geschlossen wurde, wurde der Fokus durcheinander gebracht. Also habe ich den obigen Code von postDelayed () aufgerufen. Es wurde ausgeführt, nachdem der Dialog geschlossen wurde. Profitieren.
Danylo Volokh

2
237 Stimmen auf die Antwort und 62 auf "es funktioniert nicht, Bruder" 🤔 Ich habe es getestet, um eine eigene Meinung zu bekommen und es funktioniert perfekt!)
Daniel

165

verwenden:

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

20
Nachdem ich mehr als 5 andere Ansätze ausprobiert hatte, war dies der einzige, der für mich (aus einer ViewUnterklasse)
William

13
Dieser Vorschlag führte dazu, dass die Tastatur repariert wurde, selbst wenn das Feld den Fokus verliert.
Bis zum

2
Ja, es funktioniert auch bei mir und imm.showSoftInput()funktioniert nicht.
Spark.Bao

8
Während diese Methode funktioniert, hat sie einen Nachteil: Wenn Sie die Anwendung mit der Home-Taste (Hardware) beenden, wird die Tastatur auf dem Bildschirm angezeigt. Sie müssen die Eingabetaste (Hardware) drücken, um die Tastatur zu verbergen. Verachten Sie, dass sie auf Ihrem Startbildschirm unbrauchbar ist.
Adrien Horgnies

Andere Ansätze haben bei mir nicht funktioniert, dieser hat funktioniert. Danke.
Iman Akbari

53

Das hat bei mir funktioniert, dank ungalcrys

Tastatur anzeigen:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

Tastatur ausblenden:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
Die einzige vollständige Lösung. Vielen Dank.
Korro

41

showSoftInput arbeitete überhaupt nicht für mich.

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

Ich hoffe das hilft!


5
Dies zeigte nur die Tastatur, als die Aktivität gestartet wurde.
William

1
Genial :) Versuchte eine Reihe von Antworten, aber nur damit konnte ich es zum Laufen bringen :) Vielen Dank.
Srikanth

sehr unterschätzte Antwort
Avinash R

Perfekte Antwort. Funktioniert nur mit "editText.requestFocus ()". Vielen Dank.
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
Ich musste dies tun, damit es in onResume () angezeigt wurde. Ohne die Verzögerung würde mit jeder einzelnen in diesem Thread beschriebenen Lösung nichts passieren.
FranticRock

1
Da ist es. Das war die Antwort, nach der ich gesucht habe. Sie brauchen jedoch nicht unbedingt eine ganze Sekunde Verzögerung. Ich habe nur 150 Millis ausprobiert, und das hat auch gut funktioniert.
Rubberduck

1
Vielen Dank! Dies funktioniert sogar für 0 ms ( tb.post({ showKeyboard(tb) })). Beachten Sie, dass wir eine EditText-Ansicht ( tb) benötigen , keine Fragmentansicht.
CoolMind

16

So kann eine Kotlin-Erweiterung zum Ein- und Ausblenden der Softtastatur erstellt werden:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Dann können Sie einfach Folgendes tun:

editText.showKeyboard()
// OR
editText.hideKeyboard()

Dies ist eine bessere Lösung im Vergleich zu Ruhe
D-Feverx

5

Ich empfehle die Verwendung eines LifecycleObservers, der Teil der Behandlung von Lebenszyklen mit lebenszyklusbewussten Komponenten von Android Jetpack ist .

Ich möchte die Tastatur öffnen und schließen, wenn das Fragment / die Aktivität angezeigt wird. Definieren Sie zunächst zwei Erweiterungsfunktionen für den EditText. Sie können sie an einer beliebigen Stelle in Ihrem Projekt platzieren:

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

Definieren Sie dann einen LifecycleObserver, der die Tastatur öffnet und schließt, wenn die Aktivität / das Fragment erreicht onResume()oder onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

Fügen Sie dann die folgende Zeile zu Ihren Fragmenten / Aktivitäten hinzu. Sie können den LifecycleObserver jederzeit wiederverwenden. ZB für ein Fragment:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

3

Hier ist die KeyboardHelper-Klasse zum Ausblenden und Anzeigen der Tastatur

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(Context context, View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }, 1000);
}

public static void hideSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        }
    }, 1000);
}


public static void openSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        }
    }, 1000);
}

}}


0

Erster Weg :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

Zweiter Weg :

Im Manifest:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

In Code:

etPassword.requestFocus();

0

Ich habe viele Möglichkeiten ausprobiert und es funktioniert nicht, aber ich bin mir nicht sicher, weil ich den gemeinsamen Übergang vom Fragment zur Aktivität verwende, die den Bearbeitungstext enthält.

Übrigens ist mein Edittext auch in LinearLayout eingeschlossen.

Ich habe eine leichte Verzögerung hinzugefügt, um den Fokus anzufordern, und der folgende Code hat für mich funktioniert: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

Ich konnte keine dieser Antworten dazu bringen, alleine zu arbeiten. Die Lösung für mich war, sie zu kombinieren:

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

Ich bin mir nicht sicher, warum das für mich erforderlich war - laut den Dokumenten scheint es, dass beide Methoden für sich hätten funktionieren müssen.


Dies ist definitiv keine gute Praxis. Möglicherweise hat die Aktivität oder Fragmenttransaktion mit der Softtastatur interveniert oder die Eingabemethodenflags wurden nicht richtig gesetzt, aber in beiden Fällen sollte diese Lösung nicht verwendet werden.
Marcel Bro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.