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

时间:2017-10-15 05:10:13

标签: android android-edittext android-softkeyboard ime

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

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

在一个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);

问题是它无法正常工作,我无法正确设置软件入口,我无法阻止窗口调整大小。

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

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

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

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

在这方面,有人能帮助我做错吗?我希望不同的碎片有不同的行为。

2 个答案:

答案 0 :(得分:9)

尝试这个我发现:

旨在为标签使用两种不同的模式。模式为SOFT_INPUT_ADJUST_RESIZESOFT_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);

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

答案 1 :(得分:1)

添加iBEK's评论的实施。 要使WindowsSoftInputMode正常工作,还需要做两件事:

首先添加以下标志:

export default function configureStore(initialState = {}, history, session) {
  // [cut]
  const store = createStore(
    createReducer(),
    fromJS(initialState),
    composeEnhancers(...enhancers)
  );
  // [cut]
  return store;
}

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

windowSoftInputMode="adjustResize"

指定此标志对于WindowsSoftInputMode起作用是疯狂的。

其次在您的Activity的onCreate中添加以下内容,在这种情况下为TestActivity:

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

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