如何在 Activity 启动时阻止 EditText 弹出键盘?

3

我在我的应用程序布局中有一个Edit Text,我希望只有当它被实际点击时,这个EditText才会打开键盘(我相信这被称为聚焦?)。

目前,每当应用程序打开时,键盘都会随着EditText一起打开,这不是我想要的。

我尝试了许多不同的XML标记来解决这个问题:

android:focusable="false" <--- Prevents keyboard from opening at all.

android:focusable="true"
android:focusableInTouchMode = "true"     <--- These tags give me the same result as no tags (keybaord will open on activity start)

android:focusedByDefault = "true" <--- Only available in API >= 23

我想问的是,为什么禁用EditText默认焦点这么难?我肯定错过了一种简单的方法。
编辑:在我的AndroidManifest中添加以下行可以解决问题: android:windowSoftInputMode="stateHidden" 但是,我不喜欢这个解决方案。似乎由于这在清单中,它将影响更多的UI元素,而不仅仅是我需要更改的单个EditText。

在Manifest.xml文件中添加以下行:android:windowSoftInputMode="stateHidden" - meyasir
2个回答

11

或者您可以将焦点设置为根布局元素:

android:focusable="true"
android:focusableInTouchMode="true"

例子:

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

    <EditText
        android:inputType="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

这似乎是最好的方法。谢谢! - John L. Carveth
非常欢迎。如果解决方案对您有帮助,我很高兴。我不知道这是否是最佳方式,但我知道这是一个可行的版本。 - wyzard

3

使用 android:windowSoftInputMode="stateHidden"

如果深入研究您的Activity所使用的主题,您会发现windowSoftInputMode的默认值是stateUnspecified|adjustPan。从文档中可以看到:stateUnspecified:未指定,使用系统认为最好的。这是默认值。

因此,根据您运行的Android设备不同,结果也会有所不同。我在API-26模拟器中尝试重现您的情况,键盘不会弹出。您可以使用stateHidden来确保当一个activity启动时,当EditText自身获得焦点时软键盘不会弹出。

解决这个问题的另一种方法是将requestFocus设置给UI中的其他元素,确保EditText不是第一个获得焦点的UI元素。根据我的经验,这有点像“hack”,并且它会破坏可访问性。实现的最安全和清洁的方式实际上是使用stateHidden

stateHidden:在通常适当的情况下(当用户向前导航到您的窗口时),使软输入区域隐藏起来。

请注意,这不会影响任何其他UI元素。您还可以根据屏幕背景使用adjustPan


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