停止EditText在Activity start上启动键盘?

时间:2017-11-07 16:15:56

标签: android android-edittext

我在我的一个App布局中有一个编辑文本,我希望这个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修复了此问题:     机器人:windowSoftInputMode =&#34; stateHidden&#34; 但是,我不喜欢这个解决方案。似乎因为这是在Manifest中,它将影响比我需要更改的单个EditText更多的UI元素。

2 个答案:

答案 0 :(得分:5)

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

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>

答案 1 :(得分:1)

使用android:windowSoftInputMode="stateHidden"

如果您深入研究用于活动的主题,您会发现windowSoftInputMode的默认值为stateUnspecified|adjustPan。并从文档:

stateUnspecified:未指定,使用系统认为最好的。这是默认值。

因此,根据您运行的Android设备,您的结果会有所不同。我尝试在API-26模拟器中重现您的情况并且键盘没有显示。您可以使用stateHidden来确保当活动开始时,当EditText聚焦于自身时,软键盘不会显示

解决此问题的另一种方法是requestFocus到UI中的其他元素,确保EditText不是第一个获得焦点的UI元素。根据我的经验,这是一种黑客攻击,它会破坏可访问性。最安全和最干净的方法实际上是使用stateHidden

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

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