如何从 Fragments 以编程方式设置 windowsoftinputmode?

How to set windowsoftinputmode programmatically from Fragments?

我有一个要求,其中我有一个 MainActivity。从这个 activity 我实例化 4 个片段(让我们说 FragmentA、FragmentB、FragmentC、FragmentD。

在这四个片段中;在 3 个片段上(让我们说 FragmentA、FragmentB、FragmentC),我想将 MainActivity 的 windowsoftinputmode() 设置为 SOFT_INPUT_ADJUST_PAN 以便 window 可以调整大小。

在一个 Fragment() 让我们说 FragmentD) 上,我想将 MainActivity 的 windowsoftinputmode() 设置为 SOFT_INPUT_ADJUST_NOTHING

所以我所做的是,在每个 Fragment 的 onViewCreated() 方法上,我执行以下代码行并更改 LayoutParams 标志:

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

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

问题是它不工作,我无法正确设置 SoftInputMode,我无法阻止 window 调整大小。

当我在 MainActivity 的 onCreate() 中执行它们时,相同的代码行完美运行,如下所示:

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

但是所有四个片段都设置了值。我在清单中的 MainActivity 声明是:

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

有人可以帮助我做错这件事吗?我想让不同的片段有不同的行为。

试试我发现的这个:

旨在为选项卡使用两种不同的模式。模式是 SOFT_INPUT_ADJUST_RESIZESOFT_INPUT_ADJUST_NOTHING.

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

上面的代码行本身无法正常工作。应用始终处于 ADJUST_NOTHING 状态。但是,如果将 windowSoftInputMode="adjustResize" 插入到 AndroidManifest.xml 文件中的标记中,则应用程序 window 会默认调整大小。此外,当您在 fragment

中调用以下行时
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

它将按预期运行,并且不会调整任何大小。 由我工作!

iBEK's 评论添加实现。 要使 windowsSoftInputMode 正常工作,需要完成两件事:

首先是添加以下标志:

windowSoftInputMode="adjustResize"

在AndroidManifest.xml文件中如下所示:

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

指定此标志是 windowsSoftInputMode 工作的必要条件。

其次在 Activity、TestActivity 的 onCreate 中添加以下内容:

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

现在它应该适用于 activity 托管的所有片段。我希望这能回答你的问题@iBEK。