处理输入类型为 TEXT 的 EditText 键更改事件
Handle EditText key change event with input type TEXT
我的用例是在用户在文本框中输入 4 行后限制用户。设置 maxLines
将无法停止用户。
令我惊讶的是,当输入类型为 InputType.TYPE_CLASS_TEXT
时,Android 未提供键 down/up 事件。我正在接收所有其他类型的事件。下面是我的代码。
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) {
}
甚至 activity 的 onKeyDown()
也不起作用。
当我设置 InputType.TYPE_CLASS_NUMBER
或 InputType.TYPE_CLASS_PHONE
时,它工作正常。
P.S。我想为输入类型文本获取按键 ewvent。
您可以直接查看EditText.
中输入的行
int lineCount = et.getLineCount();
lineCount
变量将 return EditText.
中的文本行数
唯一的问题是 returning 1 而没有在 EditText.
中输入任何内容
->如果要处理Enter键事件和限制用户输入另一行:
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;
}
});
不完全符合您的要求,但这是实现它的另一种方法。
您可以将 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
}
}
});
我的用例是在用户在文本框中输入 4 行后限制用户。设置 maxLines
将无法停止用户。
令我惊讶的是,当输入类型为 InputType.TYPE_CLASS_TEXT
时,Android 未提供键 down/up 事件。我正在接收所有其他类型的事件。下面是我的代码。
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) {
}
甚至 activity 的 onKeyDown()
也不起作用。
当我设置 InputType.TYPE_CLASS_NUMBER
或 InputType.TYPE_CLASS_PHONE
时,它工作正常。
P.S。我想为输入类型文本获取按键 ewvent。
您可以直接查看EditText.
int lineCount = et.getLineCount();
lineCount
变量将 return EditText.
唯一的问题是 returning 1 而没有在 EditText.
->如果要处理Enter键事件和限制用户输入另一行:
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;
}
});
不完全符合您的要求,但这是实现它的另一种方法。
您可以将 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
}
}
});