在2.3上完成SoftInput操作标签的多行EditText


82

有没有办法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

这是:

  • 类= TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • 标志= InputType.TYPE_TEXT_FLAG_MULTI_LINE

Answers:


163

好了,在重新阅读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即使可以通过乏味的布局配置来实现,我也要强制执行。


24
我通常不会给出像“ omgthank”这样的笼统的评论,但是这个答案是很有帮助的,并且没有被我理解,以至于我认为它应该得到认可。总之,谢谢。:-)
犁夫

3
答案为+1,但在这种情况下,如果您从代码中设置了edittext的输入类型。它删除垂直滚动并添加水平滚动。要解决该问题,请使用以下代码。editTextObj.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 如果通过在多个布局中包含视图来重用视图,通常会发生这种情况。@ohhorob非常感谢您的解决方案。
Jayshil Dave 2012年

2
它就像一个魅力!但我不太了解代码。您在某个地方可以阅读有关整个标志机制的信息?
vanleeuwenbram

谢谢,我是一个初学者,我将其放在使用对话框的活动中EditText,因此不在我的活动xml中。我尝试将这段代码放入活动中,但出现错误:The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method。您super一开始就打电话,所以不确定是什么问题。您有什么建议吗?谢谢。
Azurespot 2015年

@NoniA。您必须创建EditText的子类。在该类中,您必须调用此方法。创建一个扩展到EditText的类。并将该方法放在该类中。
莎阿(Shah)2015年

103

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" />

Timmmm,这是在2.3上测试的吗?
ohhorob

1
如果您的代码适用于2.3,那么我的代码也应如此。它们几乎是相同的,并且我基于我的代码或您的代码,所以谢谢!是否有4.0所没有的2.3特质?标准的“对多行编辑不执行操作”是Google故意添加的行为。
Timmmm 2012年

5
我在2.3(和4.x)上尝试过此方法,它适用于我的应用程序。
mlc 2012年

2
@ matej.smitala是的,您不能同时拥有两者。
Timmmm

1
经过数小时的寻找最佳解决方案的尝试,这似乎是在没有Enter键的情况下实现多行编辑文本的最佳和最简单方法。
micnguyen 2014年

56

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

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

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


2
@Futzilogik:先生,您应该得到更多的支持!这个答案既可以救命,也很简单。我的意思是,哇。我希望我可以不止一次投票。非常感谢!
Swayam 2014年

3
我正在运行4.4.2,这对我或至少对我而言无效。我只是用XML做到的,所以也许是个问题。我将inputType设置为“ textEmailAddress | textMultiLine”,将scrollHorizo​​ntally设置为false,将maxLines设置为500(xml文件),将singleLine设置为false,将imeOptions设置为actionNext。我尝试从输入类型中删除“ textMultiLine”。使用textMultiLine,我可以在键盘上获得ENTER键,而没有它,一切都停留在一行上,并且仍然水平滚动。这似乎是最简单的解决方案,但是上面的一个对我有用,所以现在就开始吧。
核心

6
关于我之前的评论(无法编辑),怀疑是未设置MAX_VALUE的问题,或者只是在创建edittext之后才更改了这些问题,我尝试按此处所示的代码进行操作,并且有效!我只是想为其他人发帖,您无法使用XML进行发布(或者无论如何也无法完成)。我有其他设置:singleLine = false,imeOptions = actionNext,inputType = textEmailAddress(无多行)。
核心

效果很好。这是改进旧答案的一个很好的例子!!
nPn

在运行棒棒糖的Galaxy S5上为我工作。很好的解决方案。奇怪的是,在xml中水平设置滚动不会产生相同的效果
Scott Birksted

7

遵循先前的答案

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"/> 

5

要完成操作,可以使用:

XML格式

android:inputType="text|textCapSentences"    

爪哇

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

希望它对您有用。


1

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

我有同样的问题,我的明显解决方案是简单地添加完成按钮,然后让Enter按钮添加换行符。


抱歉,我的问题可能还不够清楚。.多行用于软包装单行输入。即不允许使用换行符。
ohhorob

@Mullins:您是否在SoftInput键盘中添加了自己的“完成”按钮?在保持“ Enter”的同时,您是如何做到的?
alex.veprik 2012年

不。我在与键盘分开的UI上创建了完成按钮。
Mullins 2012年

1
嗯,也许Android团队应该遵循自己的建议,并在消息传递应用程序中使多行TextEdit的操作按钮创建换行符,而不是发送消息。
Timmmm 2012年

0

在XML中使用这些属性。

android:inputType =“ textImeMultiLine”

android:imeOptions =“ actionDone”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.