现有一个这样的需求,有一个输入数量的EditText,当输入的数量过大的时候提示“输入数量过大”,并选中文本框中的内容,本来以为很容易实现的功能,按回车的时候判断一下EditText里面的数量是否过大,过大的话调用EditText.selectAll()方法选中内容。实现方法是:
mEtOne.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
if (new BigDecimal(mEtOne.getText().toString()).setScale(0, BigDecimal.ROUND_DOWN).compareTo(new BigDecimal(99999999)) == 1) {
Toast.makeText(MainActivity.this, "数量过大", Toast.LENGTH_LONG).show();
mEtOne.requestFocus();
mEtOne.selectAll();
return true;
}
}
return false;
}
});
等实际运行起来发现只有第一次按回车的时候会选择EditText里面的内容,再点击一次EditText将内容取消选中再按回车,这一次就不能再选中内容了,并且光标移动到了第一个位置,这是一个从Android4.0开始的bug,如果显示了光标,则selectAll()选择的宽度为0,需要先不显示光标。解决方法是:
1)先调用clearFocus()方法取消焦点,这样就不显示光标了,然后再调用requestFocus()方法获取焦点,再调用selectAll()方法选中全部。
mEtOne.clearFocus();
mEtOne.requestFocus();
mEtOne.selectAll();
2)通过改变EditText内容的方式取消焦点,再重新获取焦点并选中全部。
Editable text = mEtOne.getText();
if (text.length() > 0) {
text.replace(0, 1, text.subSequence(0, 1), 0, 1);
mEtOne.selectAll();
}