ソフトキーボードをフラグメント内から隠す方法は?


83

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から着信パラメータを保存しますonCreateView。これはエラーなしで実行されますが、キーボードはhideSoftInputFromWindowinの呼び出しから隠されませんonStart

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

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

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

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

回答:


180

フラグメントがビューを作成する限り、アタッチされた、そのビューから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);
}

9
これをプロジェクトに追加しましたが、別のタブをクリックするとクラッシュします。
andro-girl 2012

4
これを実行してNullPointerExceptionでクラッシュする場合は、フラグメントonCreateViewメソッド内でInputMethodManagerを使用するだけです。そうすることで、ビューが作成され、imm.hideSoftInputFromWindow(view.getWindowToken()、0);に拡張したビューを使用して最後の行を変更できます。
オーラスフィア2016年

84

次のコード行だけが私のために機能しました:

getActivity().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

1
SOFT_INPUT_STATE_HIDDENそれと `SOFT_INPUT_STATE_ALWAYS_HIDDEN 'の違いはわかりませんが、私にとってもうまくいきました。
hBrent 2014年

2
最初の答えはうまくいきませんでした、これはトリックをしました。ありがとう
moujib 2016

1
時間の相棒を節約してくれてありがとう。
Harish Reddy 2018年

私の状況は、fragment / TabViewを使用していることです。最初のタブには、TextViewの「ヒント」があります。2番目のタブには、「editText1.setShowSoftInputOnFocus(false);」のEditTextがあるアクティビティがあります。コマンドセットと私自身のカスタムキーパッド。アプリをバックグラウンドに置いてからアプリを表示に戻すと、不要なソフトキーボードがポップアップ表示されます。onStart Life Cycle Overrideメソッドで上記のコマンドを設定すると、これが停止します。ありがとう@ShajeelAfzal
永遠にCS学生

21

アクティビティのマニフェスト定義に次の属性を追加すると、アクティビティを開いたときにキーボードがポップするのを完全に抑制します。うまくいけば、これが役立つ:

(アクティビティのマニフェスト定義に追加):

android:windowSoftInputMode="stateHidden"

おかげで、これは私がやったことです。ただし、アクティビティの開始後にキーボードを使用する必要がある場合があるため、入力方式マネージャーを使用してキーボードを表示/非表示にする方法を知りたいと思います。
WilHall 2011年

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

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

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

これを使用しましたが、ビューのインスタンスを保持する代わりに、フラグメントからgetView()を使用しました。
MrEngineer13 2015

onCreateはFragmentの外部にあるクラスなので、rootViewを渡して、このクラスのphoneKeyPadを削除できるようにします。フラグメント内のクラスではなく、フラグメント内からそれを望んでいたと思います。
モバイルアプリケーション

10

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

this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

5
DialogFragmentがある場合、これがキーボードを非表示にする唯一の方法です。
Matjaz Kristl 2014

これをどこに書くの?
mstack 2016年

@Mstackは、onActivityCreated()メソッドで動作します。override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
サミイッサ

7

このコードはフラグメントに対して機能します。

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

4

この静的メソッドを、好きな場所(アクティビティ/フラグメント)から使用します。

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

フラグメントに使用する場合は、を呼び出しますhideKeyboard(((Activity) getActivity()))


3

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

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

タブフラグメントがあり、いくつかのタブでのみキーボードを非表示にする場合は、これを使用します。
Ronny Sulistio 2018年

1

これはAPI27では機能しませんでした。これをレイアウトのコンテナに追加する必要がありました。私にとっては、これは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>

api <26では機能しませんが、これは(フラグメントクラス内で)機能します@Override public void onResume(){super.onResume(); getView()。setFocusable(true); getView()。setFocusableInTouchMode(true); getView()。requestFocus(); }
ダーコ

1

これはKotlinクラスで私のために働いた

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()
    }

}

1

フラグメントボタンリスナーでこのコードを使用します。

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

動作しますが、getActivity().getCurrentFocus().getWindowToken()nullでないかどうかを確認する必要があります。そうでない場合、フォーカスされたeditTextがないとエラーが発生します。以下の私の答えを参照してください
Duc Trung Mai

0

コードに次の行を追加するだけです。

getActivity().getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

0

Kotlinの場合:

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

0

これを使って:

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);
   }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.