4350 Stimmen

Wie kann man die Android-Softtastatur programmgesteuert schließen/ausblenden?

Ich habe eine EditText und eine Button in meinem Layout.

Nachdem Sie in das Eingabefeld geschrieben und auf die Schaltfläche Button Ich möchte die virtuelle Tastatur ausblenden, wenn ich außerhalb der Tastatur berühre. Ich nehme an, dass dies ein einfaches Stück Code ist, aber wo kann ich ein Beispiel dafür finden?

19 Stimmen

Was ist, wenn Sie nur einen EditText und mehrere Schaltflächen, wie Kontrollkästchen und Radios, haben? Der einzige Ort, an dem Sie die Tastatur benötigen, ist der einzelne EditText. Wie registrieren Sie, dass etwas anderes gewählt/angeklickt wurde, um die Tastatur auszublenden?

19 Stimmen

Ich komme mir dumm vor. Ich bin nicht in der Lage, die Tastatur auf ICS zu verstecken. Habe alle Methoden hier und Kombinationen von ihnen versucht. Keine Chance. Die Methode, um es zu zeigen, funktioniert, aber ich kann es nicht verstecken, egal, was windw Token, verstecken Flaggen, manifestieren Einstellungen oder Kerzen zu jedem Heiligen. Auf der Tastatur zeigen, sehe ich immer diese: I/LatinIME( 396): InputType.TYPE_NULL ist angegeben W/LatinIME( 396): Unerwartete Eingabeklasse: inputType=0x00000000 imeOptions=0x00000000

5 Stimmen

/** * Diese Methode wird verwendet, um die Soft-Tastatur auszublenden. * @param activity */ public void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }

66voto

shontauro Punkte 1802

Nach langem Suchen habe ich hier eine Antwort gefunden, die für mich funktioniert

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

0 Stimmen

Die einzige, die für mich für ein Motorola mit Android 5.1 gearbeitet

64voto

Alex.F Punkte 4696

Die kurze Antwort

In Ihrem OnClick Hörer rufen die onEditorAction der EditText mit IME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

Der Drill-down

Meiner Meinung nach ist diese Methode besser, einfacher und besser auf das Designmuster von Android abgestimmt. In dem obigen einfachen Beispiel (und in den meisten anderen Fällen) haben Sie eine EditText der den Fokus hat/hatte und der normalerweise auch derjenige war, der die Tastatur überhaupt erst aufgerufen hat (er ist definitiv in der Lage, sie in vielen gängigen Szenarien aufzurufen). Auf dieselbe Weise, es sollte derjenige sein, der die Tastatur auslöst, normalerweise kann dies durch einen ImeAction . Sehen Sie nur, wie ein EditText mit android:imeOptions="actionDone" verhält, wollen Sie das gleiche Verhalten mit den gleichen Mitteln erreichen.


Prüfen Sie dies zugehörige Antwort

0 Stimmen

Dies ist die Antwort. Die einzige Methode, die versionsübergreifend funktioniert. Ich kam zurück zu dieser Frage, um diese Antwort zu posten, weil ich nicht dachte, dass jemand anderes wusste

0 Stimmen

Das sollte die richtige Antwort sein. Anstatt Android dazu zu bringen, die Tastatur auszublenden, wenn sie eigentlich da sein sollte, sagen wir ihm, dass der Benutzer fertig ist, was wiederum die gleiche ImeAction [dummer Name, ich gebe es zu] auslöst, als ob der Benutzer auf der Tastatur auf "DONE" geklickt hätte. Auf diese Weise macht es keinen Unterschied, ob der Benutzer die Eingabe über die Tastatur bestätigt oder auf die UI-Schaltfläche tippt.

50voto

slinden77 Punkte 3358

Das sollte funktionieren:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

0 Stimmen

Funktioniert teilweise, auch wenn die Tastatur ausgeblendet wurde, gibt "isActive()" false zurück!

0 Stimmen

Natürlich tut es das, das soll es ja auch. Oder vielleicht verstehe ich Sie nicht. Wie auch immer, Sie könnten den Unterricht ergänzen mit hide() y show() Methoden, um mehr Kontrolle darüber zu haben, wann es angezeigt werden soll und wann nicht. Funktioniert bei mir, ich habe es auch gemacht :) Ich werde das Beispiel bearbeiten

0 Stimmen

@YoushaAleayoub Ja, das wird es. KeyBoard.toggle(fragment.getActivity())

50voto

Gott sei Dank wird es offiziell unterstützt nach 11 Jahren

Zuerst die Abhängigkeit hinzufügen implementation 'androidx.core:core-ktx:1.7.0' zu app gradle

Hier ist die einfache Projekt auf github

import android.app.Activity
import android.content.Context
import android.view.View
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity

fun View.showKeyboard() = (this.context as? Activity)?.showKeyboard()
fun View.hideKeyboard() = (this.context as? Activity)?.hideKeyboard()

fun Fragment.showKeyboard() = activity?.let(FragmentActivity::showKeyboard)
fun Fragment.hideKeyboard() = activity?.hideKeyboard()

fun Context.showKeyboard() = (this as? Activity)?.showKeyboard()
fun Context.hideKeyboard() = (this as? Activity)?.hideKeyboard()

fun Activity.showKeyboard() = WindowInsetsControllerCompat(window, window.decorView).show(WindowInsetsCompat.Type.ime())
fun Activity.hideKeyboard() = WindowInsetsControllerCompat(window, window.decorView).hide(WindowInsetsCompat.Type.ime())

3 Stimmen

Erfordert API-Stufe 31

0 Stimmen

@Johann Aus Kompatibilitätsgründen sollten Sie WindowCompat und WindowInsetsControllerCompat verwenden. Sie müssen Ihre Gradle-Abhängigkeit für androidx.core auf mindestens 1.6.0-alpha03 aktualisieren, damit die Unterstützung für SDK < 30 gegeben ist.

0 Stimmen

@Johann sehen Sie sich das Beispielprojekt an github.com/sergchil/KeyboardTest

49voto

sergio91pt Punkte 1448

Ich verwende eine benutzerdefinierte Tastatur, um eine Hex-Zahl einzugeben, so dass die IMM-Tastatur nicht angezeigt werden kann...

In v3.2.4_r1 setSoftInputShownOnFocus(boolean show) wurde hinzugefügt, um zu steuern, ob die Tastatur angezeigt wird oder nicht, wenn ein TextView den Fokus erhält, aber es ist immer noch versteckt, so dass Reflexion verwendet werden muss:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

Bei älteren Versionen habe ich sehr gute (aber bei weitem nicht perfekte) Ergebnisse mit einem OnGlobalLayoutListener , hinzugefügt mit Hilfe eines ViewTreeObserver aus meiner Root-Ansicht und prüfe dann, ob die Tastatur so angezeigt wird:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

Bei dieser letzten Lösung wird die Tastatur möglicherweise für den Bruchteil einer Sekunde eingeblendet und die Auswahlgriffe werden durcheinander gebracht.

Wenn die Tastatur in den Vollbildmodus wechselt, wird onGlobalLayout nicht aufgerufen. Um dies zu vermeiden, verwenden Sie TextView#setImeOptions(int) oder in der TextView XML-Deklaration:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

Aktualisierung: Ich habe gerade herausgefunden, was Dialoge verwenden, um die Tastatur nicht anzuzeigen, und es funktioniert in allen Versionen:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

0 Stimmen

Ich danke Ihnen. Die beiden Flags FLAG_ALT_FOCUSABLE_IM und FLAG_ALT_FOCUSABLE_IM sind eigentlich das einzige, was in meinem Fall geholfen hat. Ich wollte nicht, dass eine Tastatur in meiner Aktivität angezeigt wird - auch nicht, wenn der Benutzer auf einen Editiertext klickt. (Ich habe mein eigenes "Keypad" erstellt).

0 Stimmen

Coole Lösung, aber wenn die vordere Aktivität nicht im Vollbildmodus ist, ist die Tastatur dahinter sichtbar. Auch die Cursor-Bewegungshilfe der Tastatur ist weiterhin sichtbar. Und sie ist nicht skinnbar.

0 Stimmen

Ich unterstütze das. Von allen möglichen Möglichkeiten nur die getWindow().setFlags() Methode funktioniert, zumindest auf Lager Android 5.1. Beachten Sie, dass setSoftInputShownOnFocus() jetzt setShowSoftInputOnFocus() und nicht mehr versteckt ist, aber nicht funktioniert, zumindest nicht, wenn der Benutzer das Feld berührt.

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