wake-up-neo.com

Wie kann man die Soft-Tastatur in einem Fragment verbergen?

Ich habe ein FragmentActivity, das ein ViewPager verwendet, 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 Soft-Tastatur angezeigt. Um dem abzuhelfen, 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 funktioniert ohne Fehler, aber die Tastatur wird nicht aus dem Aufruf von hideSoftInputFromWindow in onStart ausgeblendet.

Ursprünglich habe ich versucht, das aufgeblasene Layout anstelle von container zu verwenden, d. H .:

imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);

aber dies warf ein NullPointerException, vermutlich weil das Fragment selbst keine Aktivität ist und kein eindeutiges Fenstermarker hat?

Gibt es eine Möglichkeit, die Soft-Tastatur in einem Fragment auszublenden, oder sollte ich eine Methode in FragmentActivity erstellen und sie innerhalb des Fragments aufrufen?

72
WilHall

Solange Ihr Fragment eine Ansicht erstellt, können Sie das IBinder (Fenstertoken) aus dieser Ansicht after verwenden, die angefügt wurde. Sie können beispielsweise 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);
}
154
Ian G. Clifton

Nichts außer der folgenden Codezeile funktionierte für mich:

getActivity().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
71
Shajeel Afzal

Wenn Sie der Manifestdefinition Ihrer Aktivität das folgende Attribut hinzufügen, wird die Tastatur beim Öffnen Ihrer Aktivität vollständig unterdrückt. Hoffentlich hilft das:

(Fügen Sie der Manifestdefinition Ihrer Aktivität hinzu):

Android:windowSoftInputMode="stateHidden"
21
Eric Schlenz
    @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);
}
12

Ausnahme für DialogFragment muss jedoch der Fokus des eingebetteten Dialog ausgeblendet sein, statt nur das erste EditText im eingebetteten Dialog

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
8
macio.Jun

in Fragment, das diesen Code bearbeitet

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

dies wird in meinem Fall funktionieren, wenn ich in Tabs 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);
        }
    }
}
2
Meerz

Verwenden Sie diese statische Methode an beliebiger Stelle (Aktivität/Fragment).

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 hideKeyboard(((Activity) getActivity())) auf.

0
Nazmus Saadat

In Kotlin:

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

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

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

Nichts davon funktionierte bei API27. Ich musste dies im Container des Layouts hinzufü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>
0
hiddeneyes02