Установка EditText imeOptions в actionNext не влияет при использовании цифр

вот мой edittext: -

    <com.os.fastlap.util.customclass.EditTextPlayRegular
                    android:id="@+id/full_name_et"
                    style="@style/Edittext_white_13sp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/_5sdp"
                    android:background="#00ffffff"
                    android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    android:imeOptions="actionNext"
                    android:inputType="text"
                    android:maxLength="20"
                    android:maxLines="1"
                    android:nextFocusDown="@+id/last_name_et"
                    android:textCursorDrawable="@null" /> 

когда я удалить digit в edittext он работает нормально, но с digit imeOptions не работает. Но одна удивительная вещь, если я использую singleLine вместо maxLines он работает нормально. Но!--4--> теперь устарел. Я не могу удалить цифру в моем EditText и я не хочу использовать устаревший метод. Любой может решить эту проблему. Спасибо в adavance

6 ответов


вот упрощенное решение с помощью кнопки клавиатуры программного обеспечения "Next":

final String NOT_ALLOWED_CHARS = "[^a-zA-Z0-9]+";

final EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

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

        @Override
        public void afterTextChanged(Editable s) {
            if (!TextUtils.isEmpty(s)) {
                // remove the listener to avoid StackoverflowException
                editText.removeTextChangedListener(this);
                // replace not allowed characters with empty strings
                editText.setText(s.toString().replaceAll(NOT_ALLOWED_CHARS, ""));
                // setting selection moves the cursor at the end of string
                editText.setSelection(editText.getText().length());
                // add the listener to keep watching
                editText.addTextChangedListener(this);
            }
        }
    });

здесь регулярное выражение [^a-zA-Z0-9]+ соответствует допустимым значениям android:digits на EditText В вопрос.


можно использовать

 android:lines="1"

на месте

android:maxLines 

или

android:singleLine="true".

Я знаю, что вы пробовали много решений, попробуйте с

android:lines="1"

если вы еще не пробовали раньше.


проблема в том, что вы нажимаете клавишу Enter вместо actionNext, который вам нужен, чтобы переместить курсор на следующий EditText

укажите метод ввода Action

наиболее мягкие методы ввода кнопки действий пользователей в дне угол, соответствующий текущему текстовому полю. По умолчанию система использует эту кнопку для следующего или выполненного действия, если текстовое поле позволяет многострочный текст (например, с android:inputType= "textMultiLine"), в этом случае кнопка действия возврат каретки. Однако можно указать дополнительные действия, которые может быть более подходящим для вашего текстового поля, например Send или Go.

это вызывает возврат каретки для вашей кнопки действия. Так это значит, что не стреляет android:nextFocusDown

прежде всего, давайте посмотрим, в чем разница между singleLine, который является устаревшим и maxlines, которое

singleLine

при установке android:singleLine="true" текст одной строки в EditText виден, но клавиша Enter не видна на клавиатуре

maxlines, которое

при установке android:maxLines атрибут с определенным значением только тот же объем текста строки виден в EditText и введите ключ в клавиатуре также виден для ввода.

поэтому, когда вы нажимаете кнопку действия, она запускает Enter Действия по коду. Также вы должны изменить свой атрибут inputType с помощью android:inputType="textMultiLine" если вы используете android:maxLines атрибут

maxlines, которое

добавлено в API level 1 int maxLines делает TextView не более этого много линий высотой. При использовании в редактируемом тексте inputType значение атрибута должно быть объединено с флагом textMultiLine для атрибут maxLines для применения.

может быть целочисленным значением, например "100".


когда я настроил ваш код с правильными атрибутами, он все еще запускал клавишу Enter вместо IME_ACTION_NEXT что вы хотите. Я думаю, что это не решило проблему из-за

textMultiLine можно совместить с текстом и своими изменениями для того чтобы позволить несколько строк текста в поле. Если этот флаг не установлен, текст поле будет ограничено одной строкой. Соответствовать TYPE_TEXT_FLAG_MULTI_LINE.


TYPE_TEXT_FLAG_MULTI_LINE

добавлен в API уровня 3 int Type_text_flag_multi_line флаг для TYPE_CLASS_TEXT: в поле можно ввести несколько строк текста. Если этот флаг не установлен, текстовое поле будет ограничено одна строка. IME может также выберите Не отображать клавишу enter, когда этот флаг не установлен, так как нет необходимости создавать новые русло.

постоянное значение: 131072 (0x00020000)


устранение:

подкласс EditText и настроить параметры IME. После этого вам не нужно android:maxLines или android:singleLine атрибуты.

@Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection connection = super.onCreateInputConnection(outAttrs);
        int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
        if ((imeActions&EditorInfo.IME_ACTION_NEXT) != 0) {
            // clear the existing action
            outAttrs.imeOptions ^= imeActions;
            // set the DONE action
            outAttrs.imeOptions |= EditorInfo.IME_ACTION_NEXT;
        }
        if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        }
        return connection;
    }

вы также можете проверить другой должности здесь. Я перенастроил принятый ответ этого поста на вашу цель


android:digits указывает, что EditText имеет числовой метод ввода, согласно docs

можно использовать android:inputType="personName" для достижения своей digits attr


android:maxLines только делает TextView максимум это много строк высотой, не запретить пользователю вводить больше символов.

то же самое с android:lines Это только делает TextView ровно много строк в высоту.


код решение для вашего решения, как показано ниже,

XML-файла

    <EditText
            android:id="@+id/full_name_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5sp"
            android:background="#00ffffff"
            android:imeOptions="actionNext"
            android:inputType="text"
            android:maxLines="1"
            android:maxLength="20"
            android:textCursorDrawable="@null" />

Java:

final EditText edtfirstName = (EditText) findViewById(R.id.full_name_et);


    edtfirstName.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
            if (charSequence.toString().startsWith(" ")) {
                String result = charSequence.toString().replace(" ", "").replaceAll("[^a-zA-Z]+", "");
                if (!charSequence.toString().equals(result)) {
                    edtfirstName.setText(result);
                    edtfirstName.setSelection(result.length());
                }
            } else {
                String result = charSequence.toString().replaceAll("[^a-zA-Z ]+", "");
                if (!charSequence.toString().equals(result)) {
                    edtfirstName.setText(result);
                    edtfirstName.setSelection(result.length());
                }
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });