有没有办法从Java类中更改android:windowSoftInputMode的值?

85
我希望将我的选项卡设置为每个选项卡具有不同的windowSoftInputMode属性。当所有选项卡的处理都来自一个单一活动时,如何从Java类中访问此属性?
是否有任何方法可以从Java代码访问清单属性?
5个回答

128

使用以下代码更改Activity的软键盘输入模式。

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

使用以下代码更改EditText的软键盘输入类型。

mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);

感谢 @Eliezer 进行了修正


20
谢谢这个 setSoftInputMode 方法... 它真的帮了我很多... 另外,想要访问 adjustPanadjustResize 等属性,可以使用 WindowManager.LayoutParams 类,该类中有许多有用的常量可在 setSoftInputMode 方法中使用。 - Prasham
7
@SureshBora 我结合了 @66CLSjY 的答案和 @aman 的建议,最终得到了这个代码:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 我已经测试过了,确实有效。 - Humberto Castañeda
1
这怎么是正确答案呢?根据https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#softInputMode,传递给`Window#setSoftInputMode`的唯一可接受值是`WindowManager.LayoutParams.SOFT_INPUT_*`。 - Eliezer
4
这不对我起作用。你能告诉我错过了什么吗?我在活动中调用此函数:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); 但是键盘仍然会将我的FrameLayout推上去,它在其他视图之上。除此之外,其他视图保持原位。当我将其添加到清单中时,它有效,但我不想将其应用于整个活动。 - Tamás Kozmér
1
你在onCreate()中的setContentView之前调用了setSoftInputMode()吗? - AjOnFire
显示剩余2条评论

36

根据Prasham的评论,我按照他说的做了,这救了我的命,感谢他!当您有一个带有ScrollView并动态填充它时,EditTextSoftWindowInput模式会出现一些问题。

由于我已经看过了这篇文章,但仍然继续阅读其他答案/评论(像Prashan的那个),所以我决定将其写在一个新的帖子中。

下面是我在ScrollView中使用的代码:

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

8
你好,Aman。在这里阅读你的回答有些困难。我看得出你非常感激Prashan,但是能否请你删掉一些个人评论,只解释这段代码将有助于解决什么问题?谢谢。 - Taryn East
1
嗯,不行,至少无法调整平移设置。只有在我将其放入清单中时才有效。 - User
这导致了应用程序崩溃。 - Farrakh Javed

10

我希望在标签页中使用两种不同的模式,分别是SOFT_INPUT_ADJUST_RESIZESOFT_INPUT_ADJUST_NOTHING

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

上面的代码行本身无法正常工作。应用程序始终处于状态ADJUST_NOTHING。但是,如果在AndroidManifest.xml文件中的<activity>标记中插入windowSoftInputMode="adjustResize",则默认情况下调整应用程序窗口大小。此外,当您调用以下行时:

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

它将按预期运行,不会调整任何尺寸。

附:答案的改进


2
我需要在RESIZE和NOTHING之间切换,一旦我编程回到nothing,它不会自动更改为resize。 - Taranmeet Singh
1
这是一个非常好的观察。基本上,在清单文件中设置 windowSoftInputMode="adjustResize" 可以帮助管理后面的标志,特别是在一个场景中,你大多数情况下都有 Single Activity 中的 Fragments。因此,可以通过编程方式从 SOFT_INPUT_ADJUST_RESIZE 切换到 SOFT_INPUT_ADJUST_NOTHING 来动态地保持 Activity 的输入状态。真棒! - sud007

1
在Xamarin Android中,您可以像这样通过编程实现。
 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.DetailDesign);
             Window.SetSoftInputMode(SoftInput.AdjustPan);
        }

0
您可以在程序中使用以下代码。
android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

谢谢 Deepak


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接