防止键盘在活动启动时显示

289

我有一个带有Edit Text输入框的活动。当活动被初始化时,安卓键盘会显示出来。如何让键盘保持隐藏状态,直到用户聚焦该输入框?


97
在您的清单文件中 <activity android:windowSoftInputMode="stateHidden" ...> 表示隐藏软键盘。 - idiottiger
1
可能是Android 屏幕键盘自动弹出的重复问题。 - Caleb
2
如何与 android:windowSoftInputMode="adjustPan" 一起使用? - János
5
@János android:windowSoftInputMode="adjustPan|stateHidden" 意为Android应用程序窗口软键盘模式设置,其中"adjustPan"表示屏幕被顶起以避免被软键盘覆盖,并且"stateHidden"表示在显示软键盘时隐藏其状态栏。 - Mando
这个评论中的答案就是我要找的答案: https://dev59.com/wm445IYBdhLWcg3wdqOO#23605510 - korchix
真正的答案在评论中,感谢@idiottiger。 - jerrythebum
18个回答

449

我认为以下内容可能有效

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

我以前已经用过它来做这种事情了。


有没有办法将它设置为仅数字键盘?即12键键盘? - Mohamed Khamis
@MohamedKhamis input.setRawInputType(Configuration.KEYBOARD_12KEY); @MohamedKhamis 输入.setRawInputType(Configuration.KEYBOARD_12KEY); - Karan
1
是的,它仍然有效。@SagarNayak 为什么你想要隐藏 EditText 的键盘?:) 这是为了在包含 EditText 的活动启动时隐藏键盘。 - Martynas
@Devealte 七年后对我管用了,你是否将它放在onCreate中? - Dymas
@Dymas 是的,我几个月前刚刚修复了它 :) - Devealte

196

试试这个 -

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

或者,

  1. 你也可以在你的清单文件的活动中声明 -
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="stateHidden"
          >
  1. 如果您已经使用android:windowSoftInputMode,并且值为adjustResizeadjustPan,则可以将两个值结合起来,如下所示:
<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

这将在适当的时候隐藏键盘,但在必须显示键盘的情况下平移活动视图。


6
感谢你展示了代码和 XML,确实这是最正确的答案!尤其是因为你花了大约 3 分钟写出了这两个方法,这可能是让你没有拿到第一名的原因;-) - eric

34

使用主题将其隐藏于所有活动中

<style name="MyTheme" parent="Theme">
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

设置主题

<application android:theme="@style/MyTheme">

像这样的全局方法。 - Rm558
1
这个有效,因为我在不同的地方使用了不同的主题。 - nmxprime

24
请将这两个属性添加到您的父布局中(例如线性布局、相对布局)。
android:focusable="false"
android:focusableInTouchMode="false" 

它会起作用的 :)


2
这对我不起作用,但将它们设置为“true”可以正常工作,就像Jack T的答案一样。最近版本中有行为变化吗? - Protean
除了我的回答之外,您还需要检查清单和编辑文本中的其他属性。 - King of Masses
我只是在它们中拥有最基本的属性。虽然我不明白为什么将它们设置为“false”就可以起作用,因为想法是让焦点远离EditText框。 - Protean
也许以前它是通过将焦点从父布局中移开来使EditText框失去焦点的?但现在似乎不再这样了。 - Protean

14

如果您使用的是API级别21,可以使用editText.setShowSoftInputOnFocus(false)函数。


14

尝试在清单文件中声明它

<activity
    android:name=".HomeActivity"
    android:label="@string/app_name"
    android:windowSoftInputMode="stateAlwaysHidden" >

11

只需在 AndroidManifest.xml 中添加

<activity android:name=".HomeActivity"  android:windowSoftInputMode="stateHidden">
</activity>

10

你还可以在包含“问题”所在的 .xml 布局文件的直接父布局中编写这些代码行:

android:focusable="true"
android:focusableInTouchMode="true"
例如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ...
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/myEditText"
        ...
        android:hint="@string/write_here" />

    <Button
        android:id="@+id/button_ok"
        ...
        android:text="@string/ok" />
</LinearLayout>


编辑:

举个例子,如果EditText被包含在另一个布局中:

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ... >                                            <!--not here-->

    ...    <!--other elements-->

    <LinearLayout
        android:id="@+id/theDirectParent"
        ...
        android:focusable="true"
        android:focusableInTouchMode="true" >        <!--here-->

        <EditText
            android:id="@+id/myEditText"
            ...
            android:hint="@string/write_here" />

        <Button
            android:id="@+id/button_ok"
            ...
            android:text="@string/ok" />
    </LinearLayout>

</ConstraintLayout>

关键是确保EditText不直接可聚焦。
拜拜!;-)


7

对我来说最好的解决方案是将你的类粘贴在这里

@Override
public void onResume() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onResume();
}

@Override
public void onStart() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onStart();
}

7

只需在manifest.xml文件中添加此内容即可。

<activity android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">

您已经完成了全部任务。

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