浅谈EditText几个实用技巧

EditText作为输入文本框,继承自TextView,是App中必不可少的控件。上次多功能计算器App项目中涉及到单位转换的功能,就用到两个EditText进行单位互相换算。我就把项目中掌握的几个实用技巧拿出来分享给大家,希望对大家能有所触类(第一次在CSDN写博客,有点紧张):


  • 代码设定inputType和maxLength
  • maxLines=“1”和singleLine=“true”的坑
  • 监听focus
  • 监听TextChange及应用
  • 软键盘的关闭

代码设定inputType和maxLength

inputType可以在xml文件中添加

android:inputType="numberDecimal|numberSigned"

规定输入有符号小数。但是,代码设置更为灵活,代码为:

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文件中设定:

android:maxLength="20"

代码设定:

editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)})

有时候想通过设定的长度不一样去区分EditText,可以通过反射机制去获取maxLength:

public int getMaxLength(EditText et) {
        int length = 0;
        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"

就可以实现了。大家可能会觉得

android:maxLines="1"

android:singleLine="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(0) == '.'){
                s.insert(0, "0");
            }

            //设定输入两位小数后,不能继续输入
            int pointIndex = s.toString().indexOf(".");
            if (pointIndex > 0){
                String strSubPoint = s.toString().substring(pointIndex + 1);
                //当小数点后的字符串超过3,删掉最后一个字符
                if (strSubPoint.length() == 3){
                    s.delete(s.toString().length() - 1, s.toString().length());
                }
            }
            double value = Double.valueOf(s.toString()) * 10;
            textView.setText(String.format("%s", value));
            if (value > 100){
                textView.setTextColor(Color.RED);
            }
        }
    };

软键盘的关闭

想在输入完的时候去关闭键盘,推荐:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);          imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

如果想永久的关闭键盘,可以使用反射机制实现:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值