91

FragmentActivity使用しViewPagerていくつかのフラグメントを提供しています。それぞれはListFragment、次のレイアウトの です。

<?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>

アクティビティを開始すると、ソフト キーボードが表示されます。これを解決するために、フラグメント内で次のことを行いました。

@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);
}

メイン アクティビティのウィンドウ トークンにアクセスする方法として、受信ViewGroup containerパラメーターを保存します。これはエラーなしで実行されますが、 inonCreateViewへの呼び出しからキーボードが非表示になりません。hideSoftInputFromWindowonStart

もともと、私はの代わりに膨張したレイアウトを使用しようとしましたcontainer

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

NullPointerExceptionおそらく、フラグメント自体がアクティビティではなく、一意のウィンドウ トークンを持っていないためでしょうか?

フラグメント内からソフト キーボードを非表示にする方法はありますか? または、メソッドを作成しFragmentActivityてフラグメント内から呼び出す必要がありますか?

4

18 に答える 18

196

Fragment がビューを作成する限り、アタッチにそのビューから IBinder (ウィンドウ トークン) を使用できます。たとえば、フラグメントで onActivityCreated をオーバーライドできます。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
于 2012-04-02T18:41:12.857 に答える
87

次のコード行だけが機能しました。

getActivity().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2014-05-29T13:33:28.680 に答える
14
    @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;
    }

ルート ビューのインスタンスをクラスに保持する

View view;

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

ビューを使用してキーボードを非表示にします

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

    IBinder binder = view.getWindowToken();
    inputManager.hideSoftInputFromWindow(binder,
            InputMethodManager.HIDE_NOT_ALWAYS);
}
于 2015-05-12T14:25:46.737 に答える
11

ただし例外としてDialogFragment、埋め込みのフォーカスはDialog非表示にする必要があります。代わりにEditText、埋め込み内の最初のフォーカスのみを非表示にする必要があります。Dialog

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
于 2013-12-11T19:13:33.370 に答える
3

これは私の場合、タブであるフラグメントから別のフラグメントに切り替えるときに機能します

@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);
        }
    }
}
于 2018-08-17T07:03:17.907 に答える
1

Kotlin コード

val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, 0)
于 2021-01-02T06:19:44.507 に答える
0

コトリンでは:

(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
于 2019-05-18T06:56:48.153 に答える
0

最初に

フラグメントでは、コードの下 (onActivityCreated で使用) で強制的に最初にキーボードを非表示にします。

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Objects.requireNonNull(getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}

DURING FRAGMENT (必要な場合)

また、edittext または sth の異なるキーボードが必要で、キーボードの外側を押すときにキーボードを非表示にしたい場合 (私の場合、xml に LinearLayout クラスがあります)、最初にレイアウトを初期化します。

LinearLayout linearLayout;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    View view = inflater.inflate(R.layout.<your fragment xml>, container, false);

    linearLayout= view.findViewById(R.id.linearLayout);
    ...
    return view;
}

次に、以下のコードが必要です (onViewCreated で使用):

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

    linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view12) {
            try {
                InputMethodManager inputMethodManager = (InputMethodManager) Objects.requireNonNull(VideoFragment.this.getActivity()).getSystemService(INPUT_METHOD_SERVICE);
                assert inputMethodManager != null;
                inputMethodManager.hideSoftInputFromWindow(VideoFragment.this.getActivity().getCurrentFocus().getWindowToken(), 0);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

}
于 2021-01-13T14:53:08.470 に答える