如何在屏幕显示时取消字段的自动聚焦/键盘弹出?

111

我有一个屏幕,第一个字段是EditText,在启动时获取焦点,并弹出数字输入类型,这非常令人烦恼。

我该如何确保在活动启动时不获取焦点和/或不弹出输入面板?

9个回答

165
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editTextField.getWindowToken(), 0);

或者

在应用程序标签中,将清单文件中的活动属性设置为以下内容

android:windowSoftInputMode="stateHidden"

在AndroidManifest.xml文件中设置android:windowSoftInputMode可以与其他值进行OR运算。模式通常意味着单个值,但在这种情况下,该值是一组标志的集合。 值的描述: 格式:标志 值:adjustNothing、adjustPan、adjustResize、adjustUnspecified、stateAlwaysHidden、stateAlwaysVisible、stateHidden、stateUnchanged、stateUnspecified、stateVisible 指定此活动的主窗口的默认软输入模式。这里除了“未指定”之外的任何值都会覆盖主题中的任何值。 - Jeff Muir

147

前往您的应用程序清单文件,并为您想要禁用自动弹出键盘的活动编写以下行。

android:windowSoftInputMode="stateHidden"

1
对我没用。我把它放在activity_main.xml中。当我把它放在onCreate()中时,它完美地工作了。getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); - glez

23

要在编程中不显示键盘,但默认小部件仍然保持焦点,请调用:

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

onResume()


14
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
在`onCreate()`中调用上述方法。这可以防止软键盘在用户未选择`EditText`的情况下出现,除非用户通过`点击或轻触`选择它。或者在`Manifest.xml`文件的Activity标签中简单地添加`android:windowSoftInputMode="stateHidden"`。

11

这通常是一团糟。我尝试的第一件事是通过 . 使用另一个视图来窃取焦点。您还必须拥有可聚焦和可触摸模式下可聚焦的功能。

<TextView
  ...
  android:focusable="true"
  android:focusableInTouchMode="true">

    <requestFocus/>
</TextView>

这个可行。我觉得这是一种更简洁的方法,但它也取决于你的条件。我接受这个。 - JaydeepW

5

让另一个视图获得焦点。默认情况下,当布局被填充时,第一个可聚焦的视图将获得焦点。您可以通过XML请求在不同视图上获得焦点:

<TextView
    android:layout_width="wrap_parent"
    android:layout_height="wrap_content"
    android:text="Some other view">

    <requestFocus />
</TextView>

这适用于任何视图。

如果你想要以编程方式实现它,你可以使用view.requestFocus()


1
android:windowSoftInputMode="stateHidden"添加到您在清单中的 Activity 中只会在启动 Activity 时隐藏键盘,或者正如 Google 所说:

当用户积极前往该活动时,而不是由于离开另一个活动而返回它

为了在用户按下后退按钮并从其他活动返回到您的活动时也隐藏键盘,请使用android:windowSoftInputMode="stateAlwaysHidden"

0
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED)
{
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}

3
欢迎来到 StackOverflow!这里不同于其他论坛,如果您想更改答案,只需单击“编辑”链接并进行更改。请尝试通过选择您的代码并使用代码示例按钮 {} 或按 Ctrl+K 进行格式化。 - Peter Lang

-1

我没有尝试过这个,也不在我的编程电脑附近,但我认为通过编程方式将焦点发送到父视图或类似的操作可能会解决问题 - 这更像是一种变通方法而不是解决方案,但是由于无法测试,这只是我的想法。


1
我尝试过了,但是不起作用。我在一个按钮上调用了.requestFocus();,但是键盘仍然弹出。 - Pentium10
思考可以作为注释添加 - Alberto M

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