我在我的一个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元素。
答案 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
。