Android中EditText同时支持textMultiLine与imeOptions(action/actionSend/...)

Android中EditText同时支持textMultiLine与imeOptions(action/actionSend/...)

在Android中,如果想要imeOptions起作用,则要求android:singleLine="true"或者android:inputType="text",此时不能多行显示内容,即使插入\n,内容也是显示在一行。形如:

<EditText
    android:id="@+id/et_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionSend"
    android:inputType="text"
    android:singleLine="true" />

而想要多行文字,则可以不设置android:singleLine或者android:inputType,又或者android:inputType="textMultiLine"等等,但是此时android:imeOptions设置的值却不起作用了。形如:

<EditText
    android:id="@+id/et_multi"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionSend"
    android:inputType="textMultiLine"
    android:maxLines="1"
    android:singleLine="false" />

但是如果业务又确实需要现时实现两种效果那怎么办呢?不急,方法还是有的。

1.在java代码里面直接设置

如果想要在imeOptions起作用的时候同时支持显示多行文本(此刻不能使用ENTER实现换行,但可以通过另外插入\n换行),需要在XML代码里面不设置相关代码,并在JAVA代码里面这样设置:

etText.setImeOptions(EditorInfo.IME_ACTION_SEND);
etText.setRawInputType(InputType.TYPE_CLASS_TEXT);
//or
etNone.setImeOptions(EditorInfo.IME_ACTION_SEND);
etNone.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);

或者,直接在JAVA代码里面这样写

//以下代码顺序不能错
etNone.setImeOptions(EditorInfo.IME_ACTION_SEND);
etNone.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
etNone.setSingleLine(false);

2.或者自定义一个EditText类,实现onCreateInputConnection方法:

package com.example.test;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

public class ActionEditText extends EditText {
    public ActionEditText(Context context) {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection ic = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return ic;
    }
}

然后在XML代码里面这样使用:

<com.example.test.ActionEditText
    android:id="@+id/et_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionSend"/>

参考链接https://exchangetuts.com/multi-line-edittext-with-done-action-button-1639497243952289

posted @ 2025-11-19 20:09  枫叶孤星  阅读(10)  评论(0)    收藏  举报