Запретить ввод ключа на EditText, но по-прежнему отображать текст как многострочный - PullRequest
64 голосов
/ 20 мая 2011

Как мне сделать EditText на Android таким образом, чтобы пользователь не мог вводить многострочный текст, но дисплей по-прежнему многострочный (т.е. вместо переноса текста вправо есть перенос слов?)

Это похоже на встроенное приложение SMS, где мы не можем вводить новую строку, но текст отображается в несколько строк.

Ответы [ 18 ]

46 голосов
/ 20 мая 2011

Я бы создал подкласс виджета и переопределил бы обработку события ключа, чтобы заблокировать ключ 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);
    }
}
42 голосов
/ 25 мая 2012

Это метод, в котором вам не нужно переопределять класс 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();
    }
});
24 голосов
/ 03 июля 2013

Свойство в XML

android:lines="5"
android:inputType="textPersonName"
14 голосов
/ 11 февраля 2014

Это работает для меня:

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

Показывает смайлик вместо клавиши Enter.

6 голосов
/ 07 апреля 2016

Ответ, предоставленный @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 голосов
/ 20 мая 2011

Попробуйте это:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER)
    {
        //Nothing
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
5 голосов
/ 08 ноября 2012

Я тестирую это, и, кажется, работает:

EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(android.text.InputType.TYPE_CLASS_TEXT | android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
3 голосов
/ 18 января 2016

Просто добавьте

        android:singleLine="true"

на ваш EditText

3 голосов
/ 03 июля 2015

Вы можете установить его из XML следующим образом:

android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="10"

не забудьте android:inputType="text", если вы не установите его, он не будет работать. Хотя я не знаю почему. Также не забудьте изменить maxLines на предпочитаемое значение.

2 голосов
/ 03 сентября 2018

Вот более правильный ответ, который не отображает клавишу ввода на клавиатуре 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) на явный android:inputType в файле макета XMLили setInputType(InputType.*) в коде - в котором используемый тип ввода - это все, что, как вы знаете, ограничивает ввод только однострочными (т. е. все, что уже вызывает неявно setSingleLine(true)).


Объяснение:

То, что делает setSingleLine(true), вызывает неявно setHorizontallyScrolling(true) и setLines(1), наряду с изменением некоторых настроек клавиатуры IME для отключения клавиши ввода.

Вв свою очередь, вызов setLines(1) подобен вызову setMinLines(1) и setMaxLines(1) за один вызов.

Некоторые типы ввода (т. е. константы из InputType.TYPE_*) вызывают setSingleLine(true) неявно или, по крайней мере,достигает того же эффекта.

Вывод:

Таким образом, чтобы достичь того, что хочет OP, мы просто противостоим этим неявным настройкам, возвращая эти неявные вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...