我如何做一个 Android 编辑视图“完成”按钮和隐藏键盘时点击?

当用户单击 EditView时,Android 会打开键盘,这样用户就可以在 EditView中进行写操作。

问题是,当用户完成写作时,无法隐藏键盘。用户必须按后退按钮来隐藏键盘。

有没有办法在键盘上显示一个 Done按钮来隐藏键盘?

148091 次浏览

使用 SetImeOptions并将其传递给 actionDone。 就像 textView.setImeOptions(EditorInfo.IME_ACTION_DONE);

如果该属性不为小部件更改,则最好使用 在布局 xml文件中的 android:imeOptions="actionDone"

首先,您需要将目标 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"
/>

用这个:

android:singleLine="true"

包括:

<EditText
android:id="@+id/edittext_done"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:singleLine="true"
/>

代码:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

实际上,您可以将自定义文本设置为那个小蓝色按钮

android:imeActionLabel="whatever"

在你的 EditText 上。

或者在 java 文件中使用

etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);

我随意选择 完成作为这个函数第二个参数的示例。这些操作的完整列表可以在 给你中找到。

应该注意的是,这不会导致文本出现在所有设备的所有键盘上。有些键盘不支持那个按钮上的文本(例如,快捷键)。有些设备也不支持。一个好的规则是,如果您已经在按钮上看到了文本,这将把它更改为您想要的任何内容。

用途:

android:imeActionLabel="Done"
android:singleLine="true"

使用这两条线到你的 EditText

android:imeActionLabel="Done"
android:singleLine="true"

或者您可以通过这一行程序化地实现它。

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
android:imeActionLabel="Done"
android:singleLine="true"

在 XML 文件中工作得很好。但这也会导致 editText继续输入您可能不希望输入的一行内容。因此,向代码中添加以下内容将确保您不会最终在一行中键入所有内容。

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");

当点击键盘上的下一个按钮时使用 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);

我必须指出,很多人在不知道问题所在的情况下,都会陷入这种困境。

如果你想在点击 Done时隐藏 kb,并且你设置 android:imeOptions="actionDone" & android:maxLines="1" 没有来设置你的编辑文本 inputType,那么 没有将作为默认的 inputType工作,因为编辑文本并不像很多人想的那样是 "text"

因此,只设置 inputType将给你你想要的结果 随便啦什么你设置它像 "text""number",... 等。

为了完成任务,巴顿

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

还有

Xml 中的 android:inputType="text"

从键盘上点击处理

    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;
}
});

`

Kotlin 溶液

在 Kotlin,处理 hide 键盘 + done 操作的直接方法是:

// 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
}
}

其他键盘扩展

如果你想要更多简化键盘操作的方法(显示、关闭、聚焦) : 读读这篇文章

不要忘记将这些选项添加到您的编辑文本 XML 中(如果不是在代码中的话)

<EditText ...
android:imeOptions="actionDone"
android:inputType="text"/>

需要 inputType="textMultiLine"支持? 读读这篇文章,不要在 XML 中添加 imeOptionsinputType

在你的视野中使用这个

<EditText
....
....
android:imeOptions="actionDone"
android:id="@+id/edtName"
/>

如果你正在使用

android:imeOptions="actionDone"

那么你必须使用

android:inputType="text"

那么只有你可以看到键盘上的“动作完成”按钮。

如果你根本不想要任何按钮(例如,你正在为盲人开发一个图形用户界面,那里的点击不能是定位的,你依赖于单/双/长的点击) :

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

或者在 Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE