Отключите ввод EditText, сохраняя его в фокусе - PullRequest
0 голосов
/ 13 июня 2018

У меня есть поле EditText, имя переменной valueInputField.

Я слушаю изменение ввода текста, чего я хочу добиться, во время ввода, когда формат ввода НЕ соответствует регулярному выражению, я хотел бы прекратить показывать больше вводов, но держать поле сфокусированным &Пользователь может печатать на клавиатуре, но это не дает никакого реального эффекта.

@OnTextChanged(R.id.value_input)
protected void onTextChanged(CharSequence charSequence) {
   String inputChars = charSequence.toString().trim();
   // if doesn't match regular expression, stop showing more inputs
   if (!inputChars.matches(MY_REGEXP)) {
      // this doesn't achieve what I need.
      valueInputField.setInputType(0)
   }
}

Я пробовал выше, это не работает.Как добиться того, что мне нужно?

Ответы [ 6 ]

0 голосов
/ 21 июня 2018

Если вы хотите остановить предложения в редактируемом тексте, попробуйте что-то вроде:

editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

И чтобы снова включить его после любого условия, используйте это:

editText.setInputType(InputType. TYPE_CLASS_TEXT);

Вот примерс вводом с порогом размера, здесь должно работать и с вашим регулярным выражением:

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) {
            if(s.length()< threshold){
                editText.setInputType(InputType. TYPE_CLASS_TEXT);
            }
            if(s.length()>= threshold){
                editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
0 голосов
/ 20 июня 2018

Псевдокод:

  1. дождаться, пока введенный текст будет соответствовать вашему шаблону
  2. , когда совпадение найдено, фильтр настройки
  3. должен будет вернуть тот же предыдущийСтрока на каждой клавише нажмите

Исходный код:

editText.addTextChangedListener(new TextWatcher() {
    ...
    @Override
    public void afterTextChanged(Editable editable) {
        String text = editable.toString();

        // STEP 1
        if(text.matches(myRegex) && !flag) {

            // make sure that this code block is executed only once
            flag = true;

            // STEP 2
            // when match is found, always return the same string
            // therefore disabling further editing of the editText field
            editText.setFilters(new InputFilter[]{
                new InputFilter() {
                    @Override
                    public CharSequence filter(CharSequence charSequence, int i, int i1, 
                            Spanned spanned, int i2, int i3) {
                        // STEP 3
                        return spanned.subSequence(i2, i3);
                    }
                }
            });
        }
    }
});

При настройке фильтра ввода, обратите внимание на правильный способ сделать это. Пожалуйста, проверьте этот SO ответ Стивена Байла .

0 голосов
/ 19 июня 2018

Отключение типа ввода для редактирования текста не работает должным образом при его фокусировке или редактировании.Как только вы установите для типа inout значение null, представление начнет получать методы обратного вызова при нажатии клавиши.Итак, переменная класса для проверки поля и отмены нажатых клавиш.Вот пример кода.

public class SplashActivity extends AppCompatActivity{

    EditText valueInputField;
    private  boolean allowValueField2Edit = true;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ....

        valueInputField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2{
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                String inputChars = charSequence.toString().trim();
                // if doesn't match regular expression, stop showing more inputs
                if (!inputChars.matches(MY_REGEXP)) {

                    // this doesn't achieve what I need.
                    valueInputField.setInputType(InputType.null);
                    allowValueField2Edit = false;
                }

            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });

      //Once you set the input type to none fore edit control, on Key lister will receive callbacks
        valueInputField.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
             //Here, you can add your custom logic to have key actions.
            //retrun false will have key effect, return true 
                return !allowValueField2Edit;
            }
        });

Надеюсь, это поможет ...

0 голосов
/ 15 июня 2018

Вы уже делаете setInputType(InputType.TYPE_NULL).Но его следует использовать с setEnabled(false), чтобы все заработало.

Это также изменит цвет фона.Настоятельно рекомендуется, потому что это дает пользователю подсказку, что он не примет ввод.Однако вы можете изменить его на setBackgroundColor(Color.TRANSPARENT), если хотите.

Если вы хотите скрыть курсор, добавьте setCursorVisible(false).

В качестве альтернативы вы можете использовать afterTextChanged вместо onTextChangedтак что вы сможете манипулировать текстом.

0 голосов
/ 15 июня 2018

возможно, вам следует попробовать ниже логику

maxLength=inputChars.length
if (!inputChars.matches(MY_REGEXP)) {
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
}

выше, программа установит максимальную длину EditText, когда она не соответствует регулярному выражению.

0 голосов
/ 15 июня 2018

Вы должны добавить InputFilter к вашему textView:

, вот пример:

editText.filters = arrayOf(object: InputFilter {
   override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence {
      if (Regex("[0-9]*").matches(source!!)) {
         return source
      } else {
         return source.subSequence(start, end-1)
      }
   }
})

Этот метод фильтра вызывается каждый раз, когда вызывается вход в editText.Вы можете вернуть источник, когда он соответствует регулярному выражению, в противном случае вы можете вернуть подпоследовательность источника без последнего вставленного символа.

Пример кода на Kotlin, перевод не должен доставлять вам проблем:)

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