如何在Android EditView中添加“完成”按钮并在点击后隐藏键盘?

145
当用户点击EditView时,Android会打开键盘,以便用户可以在EditView中写入内容。问题是,当用户完成输入后,没有办法隐藏键盘。用户必须按下返回按钮才能隐藏键盘。是否有一种方法可以在键盘上显示一个Done按钮,以隐藏键盘?

可能是[如何禁用EditText软键盘上的“下一个”按钮(替换为“完成”按钮)]的重复问题(https://dev59.com/SHE85IYBdhLWcg3w3Xr6)。 - ivan.mylyanyk
17个回答

190

首先,您需要将目标EditText的android:imeOptions属性设置为actionDone,如下所示。这将把您EditText软键盘中的“RETURN”按钮更改为“DONE”按钮。

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

@Michael已删除了那个链接。谢谢。 - Paresh Mayani
25
жҲ‘еҝ…йЎ»еңЁXMLдёӯж·»еҠ android:singleLine="true"жүҚиғҪи®©е®ғжӯЈеёёе·ҘдҪңгҖӮ - Jacksonkr
6
android:singleLine已过时,请使用android:maxLines="1"。 - sfmirtalebi
1
重要提示:singleLine和maxLines不是相同的。这种误解会给大家带来很多问题,我们需要在各个地方都注意到这一点。 https://dev59.com/JF0Z5IYBdhLWcg3w8kL3 - milosmns
如果我同时设置android:singleLine,这对我有效,但如果我使用android:maxLines,则无效。我发现唯一不过时的方法是通过编程方式而不是在XML中配置EditText以使完成按钮出现。 - stevehs17
显示剩余2条评论

159

使用TextView.setImeOptions方法,并将参数设置为actionDone,例如textView.setImeOptions(EditorInfo.IME_ACTION_DONE);


8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE); - sulai
19
我不得不添加 textView.singleLine(true) 以使这个程序能够正常工作。 - Jacksonkr
但自Android 2.3以来,此功能已被弃用。 - Sumit Kumar Saha

87

包含imeOptionssingleLine两者:

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

38

获取完成按钮:

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

`


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

在 XML 文件中完全正常运作。但这也会导致 editText 在单行中持续输入,而这可能不是你想要的。因此,在你的代码中添加以下内容将确保你不会一直在单行上输入所有内容。

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

1
谢谢,演示在12点进行,时间是11:58,你在11:59修复了我的问题:p - Shahzain ali
android:singleLine = "true" 已被弃用。请使用 android:lines="1"。 - Gowtham. R

15

使用这个:

android:singleLine="true"

是的...否则怎么区分换行和关闭键盘呢? - jstewart379
这是最终适用于我的解决方案。我决定在其中加入actionDone,以防一些设备有不同的反应。 - Jacksonkr

12

将下面这两行添加到你的EditText

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

或者你可以通过这行代码程序化地实现它。

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

10

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

额外的键盘扩展

如果您想要更多简化使用键盘的方法(显示、关闭、聚焦):阅读此帖子

请不要忘记在edittext Xml中添加这些选项,如果没有在代码中

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

需要支持inputType="textMultiLine"吗?阅读此帖子,不要在Xml中添加imeOptionsinputType

7
如果小部件的属性不会改变,最好在布局xml文件中使用android:imeOptions="actionDone"

7

使用:

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

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