28

我有用于输入消息(电子邮件、短信)内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码:

message.setOnEditorActionListener((textView, i, keyEvent) -> {
            switch (i) {
                case EditorInfo.IME_ACTION_DONE:
                    if (messageCanBePosted()) {
                        SoftKeyboard.hide(message);
                        postMessage();
                        return true;
                    } else {
                        return false;
                    }
                default:
                    return false;
            }
        }); 

但我也希望这个消息字段是多行的,就像在任何其他信使应用程序中一样。我可以用这条线来实现它:

android:inputType="textMultiLine"

问题是在添加此行之后 ActionDone 按钮开始像 Enter 按钮一样起作用。所以我的捕捉回调EditorInfo.IME_ACTION_DONE永远不会被调用。因此,每次用户按下该按钮时,光标都会移动到新行而不是发布消息。

如何保持 EditText 的多行行为(在多行上显示文本的能力)和 ActionDone 按钮?

4

4 回答 4

53

利用

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

在 XML 中:

android:inputType="textMultiLine"

来源:带有完成操作按钮的多行 EditText

于 2017-03-24T12:07:54.060 回答
36

最后,在这里搜索类似的线程后,我找到了解决方案。只需要在您的 Activity/Fragment 上添加这些行:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

出于某种原因,如果您从 xml 应用完全相同的设置,它将不起作用。您应该以编程方式进行。

还有另一种可能的解决方案 - 从 EditText 派生并EditorInfo.IME_ACTION_DONE手动应用。但对我来说,第一个解决方案看起来更简单。

于 2016-04-01T01:19:06.190 回答
19

继续Ruslan的回答。这个技巧奏效了,但您还需要在 XML 中处理一件事。

EditText应该有输入类型,text否则actionDone将不起作用。默认输入类型EditText确实允许用户输入换行符,因此 inputType 应设置为textie

android:inputType="text"
//And of course
android:imeOptions="actionDone"

在您的 java 类中,您需要添加:

editText.setHorizontallyScrolling(false);
于 2017-01-10T10:49:12.967 回答
0

可重复使用的 Kotlin 解决方案

感谢其他答案,在代码中设置这些值对我有用

edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value

我经常需要这个,所以这样做是为了保持代码干净:

fun EditText.multilineIme(action: Int) {
    inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
    horizontalScroll(false)
    maxLines = Integer.MAX_VALUE
}

// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)

如果您想在“完成”上添加可选的自定义操作,请尝试以下操作:

fun EditText.multilineDone(callback: (() -> Unit) = null) {
    val action = EditorInfo.IME_ACTION_DONE
    multilineIme(action)
    setOnEditorActionListener { _, actionId, _ ->
            if (action == actionId) {
                callback?.invoke()
                true
            }
            false
        }
    }
}

// Then you can call
edittext.multilineDone { closeKeyboard() }

// or just
edittext.multilineDone()
于 2020-01-17T00:09:23.007 回答