Wie verstecke ich die Softtastatur in einem Fragment?

82

Ich habe eine FragmentActivityVerwendung von a ViewPager, um mehrere Fragmente zu bedienen. Jedes ist ein ListFragmentmit 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 containerParameter 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 hideSoftInputFromWindowin 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 FragmentActivityund sie innerhalb des Fragments aufrufen?

WilHall
quelle

Antworten:

178

Solange Ihr Fragment eine Ansicht erstellt, können Sie den IBinder (Fenstertoken) aus dieser Ansicht verwenden, nachdem er angehängt wurde. Beispielsweise können Sie onActivityCreated in Ihrem Fragment überschreiben:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
Ian G. Clifton
quelle
9
Ich habe dies zu meinem Projekt hinzugefügt. Aber wenn ich auf eine andere Registerkarte klicke, stürzt es ab.
Andro-Mädchen
4
Für diejenigen, die dies tun und mit einer NullPointerException abstürzen, verwenden Sie einfach den InputMethodManager in Ihrer fragment onCreateView-Methode. Auf diese Weise haben Sie Ihre Ansicht und können die letzte Zeile mithilfe der Ansicht ändern, die Sie in imm.hideSoftInputFromWindow (view.getWindowToken (), 0) aufgeblasen haben.
Aurasphere
82

Für mich hat nur die folgende Codezeile funktioniert:

getActivity().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Shajeel Afzal
quelle
1
SOFT_INPUT_STATE_HIDDENhat auch für mich funktioniert, obwohl ich nicht weiß, was der Unterschied zwischen dem und SOFT_INPUT_STATE_ALWAYS_HIDDEN ist.
hBrent
2
Die erste Antwort hat nicht funktioniert, diese hat es geschafft. Danke
Moujib
1
Danke, dass du mir Zeit gespart hast, Kumpel.
Harish Reddy
Meine Situation ist, dass ich fragment / TabView verwende. Die erste Registerkarte enthält "Tipps" in einer Textansicht. Die zweite Registerkarte enthält eine Aktivität, bei der ich EditText (s) mit "editText1.setShowSoftInputOnFocus (false)" habe. Befehlssatz und meine eigene Tastatur. Wenn ich die App in den Hintergrund stelle und sie dann wieder sichtbar mache, wird die unerwünschte Softtastatur angezeigt. Durch Festlegen des obigen Befehls in der Methode onStart Life Cycle Override wird dies gestoppt. Danke @Shajeel Afzal
Für immer ein CS Student
21

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):

android:windowSoftInputMode="stateHidden"
Eric Schlenz
quelle
Danke, das habe ich letztendlich getan. Ich möchte jedoch weiterhin wissen, wie der Eingabemethoden-Manager zum Ein- und Ausblenden der Tastatur verwendet wird, da ich ihn möglicherweise irgendwann nach Beginn der Aktivität verwenden muss.
WilHall
12
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my, container,
                false);
        someClass.onCreate(rootView);
        return rootView;
    }

Behalten Sie eine Instanz meiner Stammansicht in meiner Klasse

View view;

public void onCreate(View rootView) {
    view = rootView;

Verwenden Sie die Ansicht, um die Tastatur auszublenden

 public void removePhoneKeypad() {
    InputMethodManager inputManager = (InputMethodManager) view
            .getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    IBinder binder = view.getWindowToken();
    inputManager.hideSoftInputFromWindow(binder,
            InputMethodManager.HIDE_NOT_ALWAYS);
}
Mobile Anwendungen
quelle
Ich habe dies verwendet, aber ich habe getView () aus meinem Fragment verwendet, anstatt eine Instanz meiner Ansicht beizubehalten.
MrEngineer13
OnCreate ist eine Klasse außerhalb des Fragments, daher übergebe ich ihm die rootView, um damit das phoneKeyPad in dieser Klasse entfernen zu können. Ich nehme an, sie wollten es aus dem Fragment heraus, nicht aus einer Klasse im Fragment.
Mobile Anwendungen
10

Ausnahme DialogFragment: Der Fokus des Embedded Dialogmuss jedoch ausgeblendet werden, stattdessen nur der erste EditTextinnerhalb des EmbeddedDialog

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
macio.Jun
quelle
5
Dies ist die einzige Möglichkeit, das Keybord auszublenden, wenn Sie über DialogFragment verfügen.
Matjaz Kristl
wo soll ich das schreiben?
Mstack
@Mstack, arbeitet mit der onActivityCreated () -Methode. override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Sami Issa
6

Dieser Code funktioniert für Fragmente:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Keshav Gera
quelle
4

Verwenden Sie diese statische Methode von jedem beliebigen Ort (Aktivität / Fragment) aus.

public static void hideKeyboard(Activity activity) {
    try{
        InputMethodManager inputManager = (InputMethodManager) activity
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        View currentFocusedView = activity.getCurrentFocus();
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

Wenn Sie für Fragment verwenden möchten, rufen Sie einfach an hideKeyboard(((Activity) getActivity())).

Nazmus Saadat
quelle
3

Dies wird in meinem Fall funktionieren, wenn ich in Registerkarten von einem Fragment zu einem anderen Fragment wechsle

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        try {
            InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
            mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {
            Log.e(TAG, "setUserVisibleHint: ", e);
        }
    }
}
Meerz
quelle
Wenn Sie ein Registerkartenfragment haben und die Tastatur nur für wenige Registerkarten ausblenden möchten, verwenden Sie diese Option.
Ronny Sulistio
1

Nichts davon funktionierte auf API27. Ich musste dies in den Container des Layouts einfügen, für mich war es ein ConstraintLayout:

<android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:focusedByDefault="true">

//Your layout

</android.support.constraint.ConstraintLayout>
hiddeneyes02
quelle
es funktioniert nicht auf API <26, aber dies funktioniert (innerhalb der Fragmentklasse) @Override public void onResume () {super.onResume (); getView (). setFocusable (true); getView (). setFocusableInTouchMode (true); getView (). requestFocus (); }
Darko
1

Das hat bei mir in der Kotlin-Klasse funktioniert

fun hideKeyboard(activity: Activity) {
    try {
        val inputManager = activity
            .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val currentFocusedView = activity.currentFocus
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }

}
Schneller Lerner
quelle
1

Verwenden Sie diesen Code in jedem Fragment-Button-Listener:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
Stan Peng
quelle
Funktioniert, aber Sie müssen überprüfen, ob getActivity().getCurrentFocus().getWindowToken()es nicht null ist. Andernfalls wird ein Fehler verursacht, wenn kein fokussierter editText vorhanden ist. Siehe meine Antwort unten
Duc Trung Mai vor
1
Ja, du hast recht. Danke @DucTrungMai
Stan Peng
0

Fügen Sie einfach diese Zeile in Ihren Code ein:

getActivity().getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Digitaler Buddha
quelle
0

In Kotlin:

(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
Zeitschmied
quelle
0

Benutze das:

Button loginBtn = view.findViewById(R.id.loginBtn);
loginBtn.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
      InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
   }
});
Duc Trung Mai
quelle