阻止在EditText上输入键,但仍将文本显示为多行

时间:2011-05-20 10:48:15

标签: android android-edittext multiline

如何在Android上创建一个EditText,使得用户可能无法输入多行文本,但显示仍然是多行的(即有文字换行而不是文本转到右侧)?

它类似于内置的SMS应用程序,我们无法输入换行符,但文本以多行显示。

18 个答案:

答案 0 :(得分:46)

我将子窗口小部件并覆盖关键事件处理以阻止Enter密钥:

class MyTextView extends EditText
{
    ...
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if (keyCode==KeyEvent.KEYCODE_ENTER) 
        {
            // Just ignore the [Enter] key
            return true;
        }
        // Handle all other keys in the default way
        return super.onKeyDown(keyCode, event);
    }
}

答案 1 :(得分:42)

这是一种方法,您不必重写EditText类。你只需用空字符串捕获并替换换行符。

myEditTextObject.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    public void afterTextChanged(Editable s) {

        for(int i = s.length(); i > 0; i--) {

            if(s.subSequence(i-1, i).toString().equals("\n"))
                s.replace(i-1, i, "");
        }

        String myTextString = s.toString();
    }
});

答案 2 :(得分:24)


XML中的属性

android:lines="5"
android:inputType="textPersonName"

答案 3 :(得分:14)

这个适用于我:

<EditText
    android:inputType="textShortMessage|textMultiLine"
    android:minLines="3"
    ... />

它显示笑脸而不是Enter键。

答案 4 :(得分:6)

@Andreas Rudolph提供的答案包含一个严重的错误,不应该使用。当您通过包含多个换行符的IndexOutOfBoundsException内的文本时,代码会导致EditText。这是由使用的循环类型引起的,Editable对象将在其内容更改(替换,删除,插入)后立即调用afterTextChanged方法。

正确的代码:

edittext.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    public void afterTextChanged(Editable s) {
        /*
         * The loop is in reverse for a purpose,
         * each replace or delete call on the Editable will cause
         * the afterTextChanged method to be called again.
         * Hence the return statement after the first removal.
         * http://developer.android.com/reference/android/text/TextWatcher.html#afterTextChanged(android.text.Editable)
         */
        for(int i = s.length()-1; i >= 0; i--){
            if(s.charAt(i) == '\n'){
                s.delete(i, i + 1);
                return;
            }
        }
    }
});

答案 5 :(得分:5)

试试这个:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER)
    {
        //Nothing
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

答案 6 :(得分:5)

我正在测试它,它似乎有效:

EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);

答案 7 :(得分:3)

只需添加

        android:singleLine="true"

到您的EditText

答案 8 :(得分:3)

你可以像这样在xml中设置它:

android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="10"
不要忘记android:inputType="text",如果你没有设置它,它就不会工作。我不知道为什么。 另外,请不要忘记将maxLines更改为您的首选值。

答案 9 :(得分:2)

这是一个更正确的答案,它不会在IME键盘上显示回车键:

// IMPORTANT, do this before any of the code following it
myEditText.setSingleLine(true);

// IMPORTANT, to allow wrapping
myEditText.setHorizontallyScrolling(false);
// IMPORTANT, or else your edit text would wrap but not expand to multiple lines
myEditText.setMaxLines(6);

此外,您可以将setSingleLine(true)替换为XML布局文件上的显式android:inputType或代码上的setInputType(InputType.*) –在其中,使用的输入类型就是您所需要的任何东西知道将输入限制为仅一行(即,任何已经隐式调用setSingleLine(true)的输入。)


说明:

setSingleLine(true)的工作是隐式调用setHorizontallyScrolling(true)setLines(1),同时更改一些IME键盘设置以禁用Enter键。

依次,对setLines(1)的呼叫就像在一次呼叫中呼叫setMinLines(1)setMaxLines(1)

某些输入类型(即InputType.TYPE_*中的常量)隐式调用setSingleLine(true),或至少达到相同的效果。

结论:

因此,要实现OP所需的功能,我们只需通过还原那些隐式调用来对那些隐式设置进行计数。

答案 10 :(得分:1)

您可以通过代码更改操作按钮

editText.imeOptions = EditorInfo.IME_ACTION_DONE
editText.setRawInputType(InputType.TYPE_CLASS_TEXT)

Xml

android:inputType="textMultiLine"

答案 11 :(得分:1)

接受的答案非常有效,直到我将带有换行符的文本复制到EditText中。所以我添加了onTextContextMenuItem来监视粘贴操作。

@Override
public boolean onTextContextMenuItem(int id) {
    boolean ret = super.onTextContextMenuItem(id);
    switch (id) {
        case android.R.id.paste:
            onTextPaste();
            break;
    }
    return ret;
}

public void onTextPaste() {
    if (getText() == null)
        return;
    String text = getText().toString();
    text = text.replaceAll(System.getProperty("line.separator"), " ");
    text = text.replaceAll("\\s+", " ");
    setText(text);
}

答案 12 :(得分:0)

    EditText textView = new EditText(activity);
    ...
    textView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
            if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) {
                return false;
            }
            ....... 

        }
    });

答案 13 :(得分:0)

<EditText 
  android:id="@+id/Msg"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"              
  android:layout_marginTop="5dip"
  android:lines="5"
  android:selectAllOnFocus="true"               
  android:hint="Skriv meddelande...\n(max 100tkn)"/>


EditText et = (EditText)findViewById(R.id.Msg);
String strTmp = et.getText().toString();
strTmp = strTmp.replaceAll("\\n"," ");

答案 14 :(得分:0)

我将提供另一个选择,因此您不必子类化EditText。创建一个InputFilter来过滤掉换行符。然后使用EditText.addInputFilter

这种输入过滤器的源代码在这里:https://gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977

您可以在构造函数中传递0,并且不允许任何换行符。另外,您可以将其与其他调整之一结合使用,例如android:imeOptions="actionDone",因为这将有助于改善某些设备上的体验。

答案 15 :(得分:0)

对于URI你可以使用:

android:inputType="textUri"
android:lines="1"
android:maxLength="128"

否则上面提到的android:inputType="textPersonName"适用于其他EditText这样的用户名等

答案 16 :(得分:0)

这是解决方案。...

<EditText
   android:id="@+id/editText"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:maxLength="150"                                 
   android:textSize="15dp"
   android:imeOptions="actionDone"
   android:inputType="text|textMultiLine"/>

在Java类中的用法

editText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {

            if (keyCode==KeyEvent.KEYCODE_ENTER)
            {
                // Just ignore the [Enter] key
                return true;
            }
            // Handle all other keys in the default way
            return (keyCode == KeyEvent.KEYCODE_ENTER);
        }
    });

答案 17 :(得分:0)

将此属性添加到EditText XML对我有用:

android:lines="1"

它允许用户输入换行符,但EditText本身的高度不会增加。