EditText作为输入文本框,继承自TextView,是App中必不可少的控件。上次多功能计算器App项目中涉及到单位转换的功能,就用到两个EditText进行单位互相换算。我就把项目中掌握的几个实用技巧拿出来分享给大家,希望对大家能有所触类(第一次在CSDN写博客,有点紧张):
- 代码设定inputType和maxLength
- maxLines=“1”和singleLine=“true”的坑
- 监听focus
- 监听TextChange及应用
- 软键盘的关闭
代码设定inputType和maxLength
inputType可以在xml文件中添加
规定输入有符号小数。但是,代码设置更为灵活,代码为:
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL
| InputType.TYPE_CLASS_NUMBER
| InputType.TYPE_NUMBER_FLAG_SIGNED)
此处有个坑,如果只设定InputType.TYPE_NUMBER_FLAG_DECIMAL是无法达到设置小数输入的预期效果的,必须加上InputType.TYPE_CLASS_NUMBER。
maxLength也可以在xml文件中设定:
代码设定:
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter()})
有时候想通过设定的长度不一样去区分EditText,可以通过反射机制去获取maxLength:
public int getMaxLength(EditText et) {
int length = ;
try {
InputFilter[] inputFilters = et.getFilters();
for (InputFilter filter : inputFilters) {
Class<?> c = filter.getClass();
if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
Field[] f = c.getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mMax")) {
field.setAccessible(true);
length = (Integer) field.get(filter);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return length;
}
maxLines=“1”和singleLine=“true”的坑
想实现一个EditText文字水平滚动的功能,于是在xml中加入
android:maxLines="1"
android:scrollHorizontally="true"
但是最后还是无效,只是显示一行,却是垂直滚动
后来发现加入
android:singleLine="true"
android:scrollHorizontally="true"
就可以实现了。大家可能会觉得
和
好像是一样的,其实不然,maxLines指的是最多可以看见的是几行,并没有指定文字的排布只有一行,而singleLine做到让文字只排布在一行中。
监听focus
点击EditText获得焦点,点击其他地方失去焦点:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
switch (v.getId()) {
case R.id.et:
if (hasFocus){//获得焦点
Log.e("ouyang", "I have focus, do something!");
}else {//失去焦点
Log.e("ouyang", "I lost focus, do something!");
}
break;
default:
break;
}
}
});
监听Text变化的TextWatcher
TextWatcher可用于监听EditText text的变化,我就举个例子:
我想用EditText输入一个最多两位小数的数字,将这个数字乘以10再实时的将改变的Text设置到TextView中,如果这个数字大于100,将TextView的字体颜色设为红色:
xml
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="40dp"
android:inputType="numberDecimal|numberSigned"
android:maxLength="20"
android:singleLine="true"
android:scrollHorizontally="true"/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:maxLength="20"
android:singleLine="true"
android:scrollHorizontally="true"/>
java
//添加TextChangeListener
editText.addTextChangedListener(textWatcher);
TextWatcher textWatcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.toString().equals("")) {//当为空字符串的时候
return;
}
//此处有个坑,输入0,再次输入“.”,就会先把0删除掉,而后又把0加在前面,
// 这样当0删掉之后只剩一个“.”,Double.valueOf(s.toString())直接挂掉,
// 所以在“.”在最前面的情况下自己把0补上
if (s.toString().charAt() == '.'){
s.insert(, "0");
}
//设定输入两位小数后,不能继续输入
int pointIndex = s.toString().indexOf(".");
if (pointIndex > ){
String strSubPoint = s.toString().substring(pointIndex + );
//当小数点后的字符串超过3,删掉最后一个字符
if (strSubPoint.length() == ){
s.delete(s.toString().length() - , s.toString().length());
}
}
double value = Double.valueOf(s.toString()) * ;
textView.setText(String.format("%s", value));
if (value > ){
textView.setTextColor(Color.RED);
}
}
};
软键盘的关闭
想在输入完的时候去关闭键盘,推荐:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), );
如果想永久的关闭键盘,可以使用反射机制实现:
public void disableShowInput(EditText editText) {
Class<EditText> cls = EditText.class;
Method method;
try {
method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
method.setAccessible(true);
method.invoke(editText, false);
} catch (Exception e) {//TODO: handle exception
}
try {
method = cls.getMethod("setSoftInputShownOnFocus", boolean.class);
method.setAccessible(true);
method.invoke(editText, false);
} catch (Exception e) {//TODO: handle exception
}
}
参考:
http://blog.csdn.net/zhuwentao2150/article/details/51546773
http://blog.csdn.net/sinat_27672523/article/details/56839837