Ich habe eine FragmentActivity
Verwendung von a ViewPager
, um mehrere Fragmente zu bedienen. Jedes ist ein ListFragment
mit dem folgenden Layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp">
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<EditText android:id="@+id/entertext"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
Beim Starten der Aktivität wird die Softtastatur angezeigt. Um dies zu beheben, habe ich im Fragment Folgendes getan:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Save the container view so we can access the window token
viewContainer = container;
//get the input method manager service
imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
. . .
}
@Override
public void onStart() {
super.onStart();
//Hide the soft keyboard
imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0);
}
Ich speichere den eingehenden ViewGroup container
Parameter von onCreateView
, um auf das Fenstertoken für die Hauptaktivität zuzugreifen. Dies läuft fehlerfrei, aber die Tastatur wird nicht vor dem Aufruf von hideSoftInputFromWindow
in verborgen onStart
.
Ursprünglich habe ich versucht, das aufgeblasene Layout anstelle von container
:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
aber dies warf ein NullPointerException
, vermutlich weil das Fragment selbst keine Aktivität ist und kein eindeutiges Fenstertoken hat?
Gibt es eine Möglichkeit, die Softtastatur innerhalb eines Fragments auszublenden, oder sollte ich eine Methode in der erstellen FragmentActivity
und sie innerhalb des Fragments aufrufen?
Für mich hat nur die folgende Codezeile funktioniert:
quelle
SOFT_INPUT_STATE_HIDDEN
hat auch für mich funktioniert, obwohl ich nicht weiß, was der Unterschied zwischen dem und SOFT_INPUT_STATE_ALWAYS_HIDDEN ist.Wenn Sie der Manifestdefinition Ihrer Aktivität das folgende Attribut hinzufügen, wird das Öffnen der Tastatur beim Öffnen Ihrer Aktivität vollständig unterdrückt. Hoffentlich hilft das:
(Zur Manifestdefinition Ihrer Aktivität hinzufügen):
quelle
Behalten Sie eine Instanz meiner Stammansicht in meiner Klasse
Verwenden Sie die Ansicht, um die Tastatur auszublenden
quelle
Ausnahme
DialogFragment
: Der Fokus des EmbeddedDialog
muss jedoch ausgeblendet werden, stattdessen nur der ersteEditText
innerhalb des EmbeddedDialog
quelle
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Dieser Code funktioniert für Fragmente:
quelle
Verwenden Sie diese statische Methode von jedem beliebigen Ort (Aktivität / Fragment) aus.
Wenn Sie für Fragment verwenden möchten, rufen Sie einfach an
hideKeyboard(((Activity) getActivity()))
.quelle
Dies wird in meinem Fall funktionieren, wenn ich in Registerkarten von einem Fragment zu einem anderen Fragment wechsle
quelle
Nichts davon funktionierte auf API27. Ich musste dies in den Container des Layouts einfügen, für mich war es ein ConstraintLayout:
quelle
Das hat bei mir in der Kotlin-Klasse funktioniert
quelle
Verwenden Sie diesen Code in jedem Fragment-Button-Listener:
quelle
getActivity().getCurrentFocus().getWindowToken()
es nicht null ist. Andernfalls wird ein Fehler verursacht, wenn kein fokussierter editText vorhanden ist. Siehe meine Antwort untenFügen Sie einfach diese Zeile in Ihren Code ein:
quelle
In Kotlin:
quelle
Benutze das:
quelle