【问题标题】:Android EditText with word-wrap but no hard returns带有自动换行但没有硬返回的 Android EditText
【发布时间】:2012-01-12 21:16:55
【问题描述】:

如果我在 EditText 小部件上设置 SingleLine=true,我会得到一个不允许用户插入硬回车的单行编辑控件(单击 Enter 移动到下一个字段而不是插入新行) .如果我不设置 SingleLine=true,用户可以插入硬回车。

如果我设置 layout_height="wrap_content",EditText 控件将垂直增长以显示所有文本。但是,只有在 SingleLine 未设置为 true 时才会这样做。

所以,我的问题是,是否可以在不让用户输入硬换行符的情况下获得自动换行和垂直调整大小?我想我可以捕获回车键,但是我还必须捕捉他们可能会在其中获得一个的其他方式(复制/粘贴,不知道还有什么?)。有没有一种简单的方法可以通过正确的属性组合来做到这一点?

与单行编辑控件的水平滚动相比,我更喜欢用户可以看到所有文本的自动换行,但我真的不希望他们认为他们可以输入多行文本(我不不想支持它)。如果必须的话,我想我可能会在将数据保存到数据库时将硬返回转换为空格(我在 PC 上同步此数据的旧应用程序无法处理硬返回)。

【问题讨论】:

    标签: java android user-interface


    【解决方案1】:

    我也在寻找可以做到这一点的东西。我找到的唯一解决方案是将 EditText 扩展如下:

    package com.kylemilligan.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 NoNewlineEditText extends EditText
    {
    
        public NoNewlineEditText(Context context) {
            super(context);
        }
    
        public NoNewlineEditText(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
        }    
    
        @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;
        }
    }
    

    然后在 XML 中使用如下:

            <com.kylemilligan.test.NoNewlineEditText
                android:id="@+id/noNewLineText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="top|left"
                android:imeOptions="actionDone"
                android:minLines="5" />
    

    希望这会有所帮助!

    【讨论】:

    • 非常有用。我不知道为什么这不是作为内置行为提供的。
    • 这是可行的,因为 Android 会自动在多行文本视图上设置 EditorInfo.IME_FLAG_NO_ENTER_ACTION。您可以将其简化为:InputConnection connection = super.onCreateInputConnection(outAttrs); outAttrs.imeOptions &amp;= ~(EditorInfo.IME_FLAG_NO_ENTER_ACTION); return connection;
    【解决方案2】:

    我对此很感兴趣,并意识到内置的 Android 消息传递应用程序在没有软键盘上的 Enter 键的情况下包装了文本。根据源布局here,使用以下选项完成。并非所有都是必要的;我相信关键是要有textShortMessagetextMultiLineflagNoEnterAction

    android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
    android:imeOptions="actionSend|flagNoEnterAction"
    

    【讨论】:

    • 与我见过的其他解决方案相比,这是一个更好的解决方案。
    • 差不多。我无法使用此解决方案,因为它似乎不允许我使用“actionDone”。我不想要表情符号或其他类似的东西;我只想要一个“完成”的动作,我不能让它与这个解决方案一起工作。
    【解决方案3】:
    editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
    //This will treat Enter as Done instead of new line:
    editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 
    
    And in XML:
    android:inputType="textMultiLine"
    

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多