web-dev-qa-db-ja.com

フラグメントからプログラムでwindowsoftinputmodeを設定する方法は?

MainActivityが1つあるという要件があります。このアクティビティから、4つのフラグメント(FragmentA、FragmentB、FragmentC、FragmentDとしましょう)をインスタンス化します。

これらの4つのフラグメントのうち。 3つのフラグメント(FragmentA、FragmentB、FragmentCとしましょう)で、MainActivityのwindowsoftinputmode()をSOFT_INPUT_ADJUST_PANに設定して、ウィンドウのサイズを変更できるようにします。

そして、あるFragment()でFragmentD)としましょう。MainActivityのwindowsoftinputmode()をSOFT_INPUT_ADJUST_NOTHINGに設定したいと思います。

つまり、各フラグメントのonViewCreated()メソッドで、LayoutParamsフラグを変更して次のコード行を実行します。

((MainActivity)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

または

((MainActivity)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

問題は、それが機能せず、SoftInputModeを正しく設定できず、ウィンドウのサイズが変更されるのを防ぐことができないことです。

次に示すように、MainActivityのonCreate()で実行すると、同じコード行が完全に機能します。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

ただし、値は4つのフラグメントすべてに設定されています。マニフェストでの私のMainActivity宣言は次のとおりです。

<activity
    Android:name="com.test.MainActivity"
    Android:launchMode="singleTask"
    Android:screenOrientation="portrait"/>

誰かが私がこれで間違っていることを助けることができますか?フラグメントごとに動作を変えたい。

7
Tarun

私が見つけたこれを試してください:

タブに2つの異なるモードを使用することを目指します。モードはSOFT_INPUT_ADJUST_RESIZEおよびSOFT_INPUT_ADJUST_NOTHING

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

上記のコード行は、それ自体では機能しません。アプリは常にADJUST_NOTHINGの状態で動作します。ただし、windowSoftInputMode = "adjustResize"がAndroidManifest.xmlファイルのタグに挿入されると、アプリウィンドウはデフォルトでサイズ変更されます。さらに、フラグメントで次の行を呼び出すとき

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

期待どおりに動作し、サイズは変更されません。私が働いた!

15
batsheva

iBEK's コメントの実装を追加します。 windowsSoftInputModeが正しく機能するには、次の2つのことを行う必要があります。

最初は次のフラグを追加することです:

windowSoftInputMode="adjustResize"

以下に示すように、AndroidManifest.xmlファイル内:

    <activity
        Android:name="com.test.TestActivity"
        Android:windowSoftInputMode="adjustResize"/>

このフラグを指定することは、windowsSoftInputModeが機能するために必須です。

次に、アクティビティのonCreate、この場合はTestActivityに次を追加します。

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

これで、アクティビティがホストしているすべてのフラグメントで機能するはずです。これが@iBEKの質問に答えることを願っています。

3
Tarun