如何使用ActionDone按钮实现Multiline EditText(不带Enter按钮)

时间:2016-03-31 16:12:38

标签: android android-edittext multiline ime imeoptions

我有EditText,用于在消息(电子邮件,短信)上输入内容。我希望消息能够立即发布在ActionDone按钮上。我使用以下代码:

beforeEach(function() {
    jasmine.getFixtures().fixturesPath = "/fixtures";
    loadFixtures('overlaynavcomp.html');
});

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

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

问题是添加此行后,ActionDone按钮开始像Enter按钮一样。所以我永远不会调用捕获android:inputType="textMultiLine" 的回调。因此,每次用户按下该按钮光标移动到新行而不是发布消息。

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

3 个答案:

答案 0 :(得分:32)

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

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

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

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

答案 1 :(得分:29)

使用

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

和XML:

android:inputType="textMultiLine"

来源:Multi-line EditText with Done action button

答案 2 :(得分:16)

继续 Ruslan 的回答。这个技巧有效,但还有一件事你需要用XML来处理。

EditText的输入类型应为text,否则actionDone将无效。默认输入类型EditText允许用户输入换行符,因此inputType应设置为text,即

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

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

editText.setHorizontallyScrolling(false);