防止键盘在活动开始时显示


265

我有一个Edit Text输入活动。初始化活动后,将显示Android键盘。在用户集中输入之前,键盘如何保持隐藏状态?


93
在您的清单中<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger 2012年


1
如何搭配使用android:windowSoftInputMode="adjustPan"
亚诺斯

4
@Jánosandroid:windowSoftInputMode =“ adjustPan | stateHidden”
Alexey Strakh

此评论的答案是我正在寻找的答案:stackoverflow.com/a/23605510/6942602
korchix

Answers:


436

我认为以下可能有效

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

我以前已经将它用于此类事情。


有没有办法将其设置为仅数字的键盘?即12键键盘?
Mohamed Khamis 2015年

@MohamedKhamis input.setRawInputType(Configuration.KEYBOARD_12KEY);
blockwala 2015年

1
是的,它仍然有效。@SagarNayak为什么要隐藏键盘EditText?:)这是在活动开始时隐藏键盘,其中包含EditText
Martynas

@Devealte 7年后,它对我有用,您是否将其放在onCreate上?
Dymas

@Dymas是的,我几个月前才修复它:)
Devealte

180

也尝试一下-

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

否则,在清单文件的活动中声明-

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="stateHidden"
          >

如果您已经使用android:windowSoftInputMode过诸如adjustResize或的值adjustPan,则可以将两个值组合起来:

<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

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


3
感谢您在代码和xml中同时显示!确实,这是最正确的答案!特别是因为可能是您花了3分钟编写这两种方法才使您不那么;;)
eric

34

隐藏所有使用主题的活动

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

设定主题

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

像这种全球方法。
Rm558

1
这是因为我在各个地方使用不同的主题而
起作用

22

将这两个属性添加到您的父版式(例如:线性版式,相对版式)

android:focusable="false"
android:focusableInTouchMode="false" 

它将解决问题:)


2
这对我不起作用,但是true按照Jack T的回答,将它们设置为有效。最新版本中是否有行为更改?
Protean '18

除了我的答案,您还需要检查清单中的其他属性以及用于编辑文本的属性。
大众之王'18

我只是其中最基本的属性。我不明白为什么将这些设置为false应该可行,因为这样做的目的是使焦点从EditText框移开。
Protean '18

也许它过去通过将焦点从父布局移开而使焦点从EditText框移开了?但似乎不再了。
Protean '18

13

尝试在清单文件中声明

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

11

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


9

只需添加AndroidManifest.xml

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

8

只需将其添加到manifest.xml文件中

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

大功告成


7

您还可以在具有“问题”的.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不能直接聚焦。
再见!;-)


6

最适合我的解决方案,粘贴您的课程

@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();
}

3

隐藏键盘的功能。

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();

    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

在AndroidManifext.xml文件中隐藏键盘。

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">

3

扩展@Lucas接受的答案:

在生命周期的早期事件之一中,从您的活动中调用此方法:

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

Kotlin示例:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}

2

您可以尝试为每个元素设置此唯一属性

TextView mtextView = findViewById(R.id.myTextView);
mtextView.setShowSoftInputOnFocus(false);

元素处于焦点状态时键盘不会显示


虽然这可以回答作者的问题,但缺少一些解释性的单词和/或指向文档的链接。如果没有原始短语,原始代码片段不是很有帮助。您可能还会发现如何写一个好的答案很有帮助。请编辑您的答案- 来自评论
尼克


0

只需将其添加到您的活动中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
      if (getCurrentFocus() != null) {
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
      }
      return super.dispatchTouchEvent(ev);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.