Android 使用输入类型TEXT处理EditText键更改事件

Android 使用输入类型TEXT处理EditText键更改事件,android,android-edittext,keylistener,addtextchangedlistener,onkeylistener,Android,Android Edittext,Keylistener,Addtextchangedlistener,Onkeylistener,我的用例是在用户在文本框中输入4行后限制用户。设置maxLines将无法停止用户 当输入类型为InputType.type\u CLASS\u TEXT时,Android没有提供按键向下/向上事件,这让我感到惊讶。我正在接收所有其他类型的事件。下面是我的代码 EditText et = new EditText(this); et.setMaxLines(3); et.setSingleLine(false); et.setInpu

我的用例是在用户在文本框中输入4行后限制用户。设置maxLines将无法停止用户

当输入类型为InputType.type\u CLASS\u TEXT时,Android没有提供按键向下/向上事件,这让我感到惊讶。我正在接收所有其他类型的事件。下面是我的代码

        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\u CLASS\u号码或InputType.TYPE\u CLASS\u手机时,它工作正常


另外,我想获得输入类型文本的向下键ewvent。

您可以直接检查在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
                }

            }
        });
int lineCount=et.getLineCount

lineCount变量将返回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
                }

            }
        });
唯一的问题是它返回1而没有在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
                }

            }
        });
->如果要处理Enter key事件并限制用户输入另一行:


不完全是你要求的,但这是实现它的另一种方式

您可以将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
                }

            }
        });

您可以在EditText中使用android:maxLength,而不是max line。字符长度将根据设备宽度而变化。请尝试设置et.setSingleLineRue;用于文本输入类型。但如何在用户按键时获取任何事件。更改文本后将调用onTextChange。我想先限制一下。