Обработка события изменения ключа EditText с типом ввода TEXT - PullRequest
0 голосов
/ 27 ноября 2018

Мой вариант использования - ограничить пользователя после того, как он ввел 4 строки в текстовом поле.Настройка maxLines не будет работать, чтобы остановить пользователя.

Я удивлен, что Android не обеспечивает событие нажатия клавиши вниз / вверх, когда тип ввода InputType.TYPE_CLASS_TEXT.Я получаю событие для всех других типов.Ниже приведен мой код.

        EditText et = new EditText(this);
        et.setMaxLines(3);
        et.setSingleLine(false);
        et.setInputType(InputType.TYPE_CLASS_TEXT);
        et.setHint("First edit text");
        et.setKeyListener(this); // This key listener is also not working.
        et.setOnKeyListener(new View.OnKeyListener() { 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.d("MainActivity.class", "event received"); // This event is never called.
                return false;
            }
        });

@Override
public int getInputType() {
    return InputType.TYPE_CLASS_NUMBER;
}


@Override
public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) { // THIS EVENT HITS ONLY WHEN INPUT TYPE IS OTHER THAN TEXT.
    return false;
}

@Override
public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
    return false;
}

@Override
public boolean onKeyOther(View view, Editable text, KeyEvent event) {
    return false;
}

@Override
public void clearMetaKeyState(View view, Editable content, int states) {

}

даже onKeyDown() активности также не работает.

Когда я устанавливаю InputType.TYPE_CLASS_NUMBER или InputType.TYPE_CLASS_PHONE, он работает нормально.

PS Я хочу получить ключ от ewvent для ввода типа текста.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Не совсем то, что вы просили, но это еще один способ сделать это.

Вы можете добавить textChangedListener к вашему EditText.

editText.addTextChangedListener(new TextWatcher() {
            String text;
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if(editText.getLineCount()==2)
                {
                    text=s.toString();
                }
            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {
                if(editText.getLineCount()>2)
                {
                    editText.setText(text);
                    editText.setSelection(text.length()); //move cursor to the end of the string
                }

            }
        });
0 голосов
/ 27 ноября 2018

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

int lineCount = et.getLineCount();

lineCount, и будет возвращать количество строк текста только в EditText.

проблема в том, что он возвращает 1 , ничего не вводя в EditText.

-> Если вы хотите обработать Ввести ключевое событие и запретить пользователю вводить другую строку :

et.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                if(et.getLineCount() <= 3) {
                    Toast.makeText(mContext, "Text =" + et.getText()+ ", and lines = " + et.getLineCount(), Toast.LENGTH_SHORT).show();
                    return false;
                } else {
                    Toast.makeText(mContext, "Only four lines permitted...", Toast.LENGTH_SHORT).show();
                    return true;
                }

            }
            return false;
        }
    });
...