【问题标题】:How to implement Multiline EditText with ActionDone button (without Enter button)如何使用 ActionDone 按钮(不带 Enter 按钮)实现多行 EditText
【发布时间】:2016-07-20 05:04:39
【问题描述】:

我有用于在消息(电子邮件、短信)上输入内容的 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 按钮?

【问题讨论】:

    标签: android android-edittext multiline ime imeoptions


    【解决方案1】:

    使用

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

    在 XML 中:

    android:inputType="textMultiLine"
    

    来源:Multi-line EditText with Done action button

    【讨论】:

    • 只有这个对我有用,它就像一个魅力 - 完成按钮显示和工作,当 EditText 最初为空时只有一行可见,当用户键入时扩展为更多行在 OR 中,最初从代码 (setText) 添加了更多文本。
    • 如果能引用出处就好了:stackoverflow.com/a/41022589/4607733
    • 谢谢,搜索了几个小时后,您是对的,仅通过更改 xml 不起作用。真是一团糟……
    • 终于,成功了!这对我来说很神奇,多年来,xml EditText 属性中的这个可怕的错误!
    • 对于多行 URL 文本输入字段,这对我有用:editText.setRawInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); editText.setImeOptions(EditorInfo.IME_ACTION_DONE);,您无需在 EditText XML 属性中指定任何内容。一些键盘通过显示网址建议或显示“.com”键来适应此 InputType。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • @silverFox 是的,它对我有用。您在 xml 中为 EditText 定义了哪些属性?
    • 绝对精彩。几天来我一直在尝试这样做,并认为这是不可能的。谢谢!
    • 终于!从 EditText 派生并手动应用 DONE 导致 editText 行为怪异(失去焦点忽略设置文本.. 魔术......)这个简单的解决方案就像一个魅力。
    • 这个答案 + editText.setRawInputType(InputType.TYPE_CLASS_TEXT) 为我工作.. 在我的具体情况下,我也在 xml 中使用数字字段 (stackoverflow.com/questions/2361497/…)
    【解决方案3】:

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

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

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

    在你的java类中你需要添加:

    editText.setHorizontallyScrolling(false);
    

    【讨论】:

    • inputType=text & imeOptions=actionDone in xml 和 setHorizo​​ntallyScrolling() 在代码中做到了!谢谢,终于。
    【解决方案4】:

    可重用的 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2011-02-28
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多