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

时间:2011-02-16 08:38:55

标签: android android-edittext

有没有办法让多行EditText出现并在Android 2.3上使用IME行动标签“完成”?

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

为多线配置EditText时,Android 2.3无法显示软输入键盘的“完成”操作。

我已设法使用KeyListener更改了“软输入”输入按钮的行为,但输入按钮仍然看起来像输入键。


以下是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 -->

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

inputType = 0x20001

这是:

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

7 个答案:

答案 0 :(得分:160)

好了,在重新阅读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;
}

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

答案 1 :(得分:100)

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

请注意,某些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" />

答案 2 :(得分:55)

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

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

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

答案 3 :(得分: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;
    }
}

一样使用
<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"/> 

答案 4 :(得分:4)

将动作完成后,您可以使用:

XML

android:inputType="text|textCapSentences"    

JAVA

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

我希望它适合你。

答案 5 :(得分:1)

显然原始问题的答案是肯定的,但我相信Android团队正在努力让开发人员思考他们如何使用多行EditText。他们希望输入键添加换行符,并且可能希望您提供一个按钮或其他输入方法来引发您已完成编辑的事件。

我有同样的问题,我的明显解决方案只是添加一个完成按钮,然后让回车按钮添加换行符。

答案 6 :(得分:0)

在XML中使用这些属性。

  

机器人:的inputType = “textImeMultiLine”

     

机器人:imeOptions = “actionDone”