当用户点击 EditView
时,Android 会打开键盘以便用户在 EditView
中书写。
问题是,当用户写完后,没有办法隐藏键盘。用户必须按下后退按钮才能隐藏键盘。
有没有办法在键盘上显示一个 Done
按钮来隐藏键盘?
首先,您需要将目标 EditText 的 android:imeOptions
属性设置为等于 actionDone
,如下所示。这会将 EditText 软键盘中的“返回”按钮更改为“完成”按钮。
<EditText
android:id="@+id/edittext_done"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Enter some text"
android:imeOptions="actionDone"
android:singleLine="true"
/>
使用 TextView.setImeOptions 并将其传递给 actionDone。像textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
textView.singleLine(true)
才能使其以编程方式工作。
包括both imeOptions
和 singleLine
:
<EditText
android:id="@+id/edittext_done"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:singleLine="true"
/>
android:imeActionLabel="Done"
android:singleLine="true"
在 XML 文件中工作得很好。但这也会导致 editText
继续输入您可能不想要的单行。因此,在您的代码中添加以下内容将确保您最终不会在一行中输入所有内容。
mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");
为了完成按钮
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
和
android:inputType="text"
在 xml 中
用于处理从键盘单击完成
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
if(actionId == EditorInfo.IME_ACTION_DONE){
// Your action on done
return true;
}
return false;
}
});
`
用这个:
android:singleLine="true"
actionDone
也放入其中,以防某些设备反应不同。
将这两行用于您的 EditText
android:imeActionLabel="Done"
android:singleLine="true"
或者您可以通过这一行以编程方式实现它。
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
利用:
android:imeActionLabel="Done"
android:singleLine="true"
如果小部件的属性没有更改,则在布局 xml
文件中使用类似 android:imeOptions="actionDone"
可能会更好。
我必须指出这一点,因为很多人可能会在不知道问题的情况下陷入困境。
如果您希望在单击 Done
时隐藏 kb,并设置 android:imeOptions="actionDone"
& android:maxLines="1"
没有设置您的 EditText inputType
它将不工作,因为 EditText 的默认 inputType
不是很多人认为的 "text"
。
因此,仅设置 inputType
将为您提供您想要的结果 whatever 您将其设置为 "text"
、"number"
、...等。
Kotlin 解决方案
在 Kotlin 中处理隐藏键盘 + 完成操作的直接方法是:
// Set action
edittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
// Hide Keyboard
val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
true
}
false
}
Kotlin 扩展
使用它在您的主代码中调用 edittext.onDone {/*action*/}
。使其更具可读性和可维护性
edittext.onDone { edittext.hideKeyboard() }
fun View.hideKeyboard() {
val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}
fun EditText.onDone(callback: () -> Unit) {
// These lines optional if you don't want to set in Xml
imeOptions = EditorInfo.IME_ACTION_DONE
maxLines = 1
setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
callback.invoke()
true
}
false
}
}
其他键盘扩展
如果您想要更多简化键盘操作的方法(显示、关闭、聚焦):Read this post
如果不在代码中,请不要忘记将这些选项添加到您的 edittext Xml
<EditText ...
android:imeOptions="actionDone"
android:inputType="text"/>
需要 inputType="textMultiLine" 支持吗?阅读这篇文章,不要在 Xml 中添加 imeOptions 或 inputType
对于代码:
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
ActionDone 在单击键盘中的下一个按钮时使用,此时键盘是隐藏的。在编辑文本或 AppcompatEdit 中使用
XML
1.1 如果使用 AppCompatEdittext
<android.support.v7.widget.AppCompatEditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"/>
1.2 如果你使用Edittext
<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"/>
JAVA
EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
实际上,您可以为那个蓝色小按钮设置自定义文本。在 xml 文件中,只需使用
android:imeActionLabel="whatever"
在您的 EditText 上。
或者在java文件中使用
etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);
我随意选择 IME_ACTION_DONE 作为该函数的第二个参数中应该包含的内容的示例。可以找到这些操作的完整列表here。
应该注意的是,这不会导致文本出现在所有设备的所有键盘上。某些键盘不支持该按钮上的文本(例如 swiftkey)。有些设备也不支持它。一个好的规则是,如果您看到按钮上已经有文本,这会将其更改为您想要的任何内容。
如果您正在使用
android:imeOptions="actionDone"
那么你必须使用
android:inputType="text"
那么只有您可以在键盘中看到“操作完成”按钮。
在您的视图中使用它
<EditText
....
....
android:imeOptions="actionDone"
android:id="@+id/edtName"
/>
如果您根本不想要任何按钮(例如,您正在为盲人开发一个 GUI,其中点击无法定位并且您依赖单/双/长点击):
text.setItemOptions(EditorInfo.IME_ACTION_NONE)
或者在 Kotlin 中:
text.imeOptions = EditorInfo.IME_ACTION_NONE
android:singleLine="true"
才能通过 xml 工作