多线EditText,2.3上有完成的SoftInput动作标签

ohh*_*rob 80 android android-edittext

有没有办法让Multi-Line EditText出现并在Android 2.3上使用IME Action Label"Done"?

在Android 2.2中,这不是问题,输入按钮显示IME操作标签"完成"(android:imeActionLabel="actionDone"),并在单击时取消软输入.

配置EditText多线时,Android 2.3无法显示软输入键盘的"完成"操作.

我已经设法通过使用a来改变Soft Input输入按钮的行为KeyListener,但是enter按钮仍然看起来像一个回车键.


这是宣言 EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->
Run Code Online (Sandbox Code Playgroud)

inputType在加载后在活动中设置内容视图时检查值,它显示为:

inputType = 0x20001
Run Code Online (Sandbox Code Playgroud)

这是:

  • class = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • flags = InputType.TYPE_TEXT_FLAG_MULTI_LINE

ohh*_*rob 161

好吧,在重新阅读TextViewEditorInfo文档之后,很明显该平台将强制IME_FLAG_NO_ENTER_ACTION进行多行文本视图.

请注意,TextView将在多行文本视图上自动为您设置此标志.

我的解决方案是EditText让平台配置它们后继承和调整IME选项:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection connection = super.onCreateInputConnection(outAttrs);
    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
        // clear the existing action
        outAttrs.imeOptions ^= imeActions;
        // set the DONE action
        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
    }
    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
    }
    return connection;
}
Run Code Online (Sandbox Code Playgroud)

在上面,我也强迫IME_ACTION_DONE,即使这可以通过繁琐的布局配置来实现.

  • 我通常不会给出像'omg thanks'这样的通用评论,但是这个答案非常有用且不受重视,我认为它值得认可.总之,omg谢谢.:-) (24认同)
  • 答案为+1,但如果您在此情况下从代码设置edittext的输入类型.它删除垂直滚动并添加水平滚动.要解决该问题,请使用以下代码.editTextObj.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 如果您通过在多个布局中包含相同的视图来重复使用视图,通常会发生这种情况.@ohhorob非常感谢您的解决方案. (3认同)
  • 它就像一个魅力!但我真的不懂代码.你有一个地方我可以阅读有关整个旗帜机制的内容吗? (2认同)

Tim*_*mmm 101

Ohhorob的答案基本上是正确的,但他的代码实际上是多余的!它基本上等同于这个更简单的版本(懒惰读者的完整代码):

package com.example.views;

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

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
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 defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,一些inputType选项,如textShortMessage使这不起作用!我建议你先来inputType="text".以下是如何在XML中使用它的方法.

<com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />
Run Code Online (Sandbox Code Playgroud)

  • 我在2.3(和4.x)上试过这个,它适用于我的应用程序. (5认同)
  • 不,但我不明白为什么它不起作用. (2认同)
  • @ matej.smitala是的,你不能两者兼得. (2认同)
  • 九年后,这在 SDK 30 上仍然具有魅力 (2认同)

小智 55

子类化EditText类的另一种解决方案是使用以下方法配置EditText实例:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

至少,这适用于Android 4.0.它配置EditText实例,以便用户编辑单线字符串,即使设置了IME操作,也会在多行上进行软包装.

  • 这可以创造奇迹而且不需要子类. (6认同)
  • 关于我以前的评论(无法编辑),怀疑它是一个没有设置MAX_VALUE的问题,或者只是在创建edittext后更改这些,我尝试在这里指示的代码,它的工作原理!我只是想为其他人发帖,你不能用XML(或者我无论如何).我有其他设置:singleLine = false,imeOptions = actionNext,inputType = textEmailAddress(没有多行). (6认同)
  • 我正在运行4.4.2,这对我来说不起作用,或者至少对我这样做.我只用XML做过,所以也许这是一个问题.我将inputType配置为"textEmailAddress | textMultiLine",将scrollHorizo​​ntally配置为false,将maxLines配置为500(xml文件),将singleLine配置为false,将imeOptions配置为actionNext.我尝试从inputtype中删除"textMultiLine".使用textMultiLine,我在键盘上输入了ENTER键,没有它,所有内容都保持在一行并且仍然水平滚动.这似乎是最简单的解决方案,但上面的解决方案对我有用,所以现在就去使用它. (3认同)
  • @Futzilogik:你,先生,值得更多的赞成!这个答案是一个救生员,也是一个简单的答案.我的意思是,omg哇.我希望我能不止一次地投票.非常感谢! (2认同)

小智 6

按照上一个回答

public class MultiLineText extends EditText {

    public MultiLineText(Context context) {
        super(context);
    }

    public MultiLineText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MultiLineText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection connection = super.onCreateInputConnection(outAttrs);
        int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
        if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
            // clear the existing action
            outAttrs.imeOptions ^= imeActions;
            // set the DONE action
            outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
        }
        if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        }
        return connection;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用它就像

<myapp.commun.MultiLineText
  android:id="@+id/textNotes"
  android:layout_height="wrap_content"
  android:minHeight="100dp"
  android:layout_width="wrap_content"
  android:hint="Notes"
  android:textSize="20sp"
  android:padding="7dp"
  android:maxLines="4"/> 
Run Code Online (Sandbox Code Playgroud)


Ale*_*aos 5

要完成操作,可以使用:

XML格式

android:inputType="text|textCapSentences"    
Run Code Online (Sandbox Code Playgroud)

爪哇

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

希望它对您有用。