editText的使用

editText的限定输入

inputType属性和digits属性

https://www.jianshu.com/p/bd4273c12e5b

 

1,设置editText可编辑和不可编辑状态

不可编辑状态

editText.setClicked(false);

editText.setFocusable(false);

editText.setFocusableInTouchMode(false);

可编辑状态

editText.setClicked(true);

editText.setFocusableInTouchMode(true);

editText.setFocusable(true);

editText.requestFocus();

 

2更改下划线样式

https://segmentfault.com/a/1190000009507919

方法1,设置一个主题风格并引用

<style name="myEditText" parent="Theme.AppCompat.Light">
//默认的颜色
        <item name="colorControlNormal">@color/color_white</item>
//激活(获取焦点)的颜色
        <item name="colorControlActivated">@color/color_orange</item>
    </style>

 

android:theme="@style/myEditText"

方法2,更改默认主题的颜色设置,这个是全局变量,意思是更改后,整个应用的对应颜色都会变化

更改自己的theme设置中colorAccent属性即可

 

3设置密码显示和可见

https://blog.csdn.net/tianhe718/article/details/53099322

方法1

evPasswordValue.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                EditText ev=(EditText) v;
                if (hasFocus) {
                    ev.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);
                } else {
                    ev.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);
                }
            }
        });

注意,设置密码不可见,需要同时设置InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD才有效

方法2

evPasswordValue.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                EditText ev=(EditText) v;
                if (hasFocus) {
                    ev.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                } else {
                    ev.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }
            }
        });

4 监听文字变化

(1)监听输入完成后,点击确认

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                Log.i(TAG, "onEditorAction: v="+v);
                Log.i(TAG, "onEditorAction: actionId="+actionId);
                Log.i(TAG, "onEditorAction: event="+event);
                return true;
            }
        });

控制台显示

查看

TextView.OnEditorActionListener()

源码参数说明

        
         * Called when an action is being performed.
            当一个动作发生时调用
         *
         * @param v The view that was clicked.    
            (点击的控件)

         * @param actionId Identifier of the action.  This will be either the
         * identifier you supplied, or {@link EditorInfo#IME_NULL
         * EditorInfo.IME_NULL} if being called due to the enter key
         * being pressed.
             (动作标识符)
            可以自定义或者如果由于输入键被按下而被调用,返回默认的通用未指定(EditorInfo.IME_NULL)

         * @param event If triggered by an enter key, this is the event;
         * otherwise, this is null.
            (触发事件的动作ID)
            如果触发的是enter键,event就是输入事件,否则就是null
         * @return Return true if you have consumed the action, else false.
            如果处理该event就返回true,否则就返回false

(2)动态监听text变化

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)                     
            {
                Log.i(TAG, "beforeTextChanged: s="+s);
                Log.i(TAG, "beforeTextChanged: start="+start);
                Log.i(TAG, "beforeTextChanged: count="+count);
                Log.i(TAG, "beforeTextChanged: after="+after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.i(TAG, "onTextChanged: s="+s);
                Log.i(TAG, "onTextChanged: start="+start);
                Log.i(TAG, "onTextChanged: before="+before);
                Log.i(TAG, "onTextChanged: count="+count);
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.i(TAG, "afterTextChanged: s="+s);
            }
        });

控制台输出,输入ww

按照顺序执行3个函数

beforeTextChanged(),
onTextChanged()
afterTextChanged()

可以在

afterTextChanged()

中获取实时editText中的文本内容

String text=s.toString();

5.打开活动editText控件自动获取焦点,弹出软键盘

            evSearch.requestFocus();
        
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        

关闭控件时取消焦点,尝试隐藏输入法

 evSearch.requestFocus();
        
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(Objects.requireNonNull(Objects.requireNonNull(getActivity()).getCurrentFocus()).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        

 

具体参考Android InputMethodManager输入法简介

 

相反,如果打开活动时,不希望editText自动获取焦点,打开软键盘

 

        evSearch.setFocusable(false);
        evSearch.setFocusableInTouchMode(false);
        evSearch.clearFocus();
        evSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!evSearch.hasFocus())
                    evSearch.setFocusable(true);
                evSearch.setFocusableInTouchMode(true);
                evSearch.requestFocus();
            }
        });

6 editText实用的配置属性

在配置editText属性时,设置

//         取消下划线
                android:background="@null"
//         提示文字
                android:hint="@string/length_not_exceeding_100"
//         自动换行
                android:inputType="textMultiLine"
//         文字长度不超过100
                android:maxLength="100"
//         限定输入字符串范围
                android:digits="0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM"

 

7.正则表达式的使用

不用浓缩,最简单的方式

//    对一个类似于 "2018年08月25日 14时13分35秒"或者"2018-10-01"的字符串做转换"08月25日"
    public String getDateFromString(String s) {
        String date="";
        if (s==null){
            return date;
        }
        if (s.contains("年")){
            date=s.substring(s.indexOf("年")+1,s.indexOf("日")+1);
        }
        if (s.contains("-")){
            String regEx = "-[0-9]{2}-[0-9]{2}";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(s);
            if (matcher.find()) {
                date = matcher.group().substring(1);
                date = date.replace("-", "月")+"日";
            }
        }
        return date;
    }

//    对一个类似于 "2018年08月25日 14:13:35"的字符串做转换"14:13"
    public String getTimeFromString(String s) {
        String time="";
        if (s==null){
            return time;
        }
        getDateFromString(s);
        if (s.contains(":")){
            String regEx = "[0-9]{2}:[0-9]{2}:";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(s);
            if (matcher.find()) {
                time = matcher.group();
                time=time.substring(0,time.length()-1);
            }
        }
        if (s.contains("时")&&s.contains("分")){
            String regEx = "[0-9]{2}时[0-9]{2}分";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(s);
            if (matcher.find()) {
                time = matcher.group();
                time=time.substring(0,time.length()-1);
                time=time.replace("时",":");
            }
        }
        return time;
    }

//    手机号校验
//    移动号段:139 138 137 136 135 134 147 150 151 152 157 158 159 178 182 183 184 187 188
//    联通号段:130 131 132 155 156 185 186 145 176
//    电信号段:133 153 177 173 180 181 189
//    虚拟运营商号段:170 171
    public boolean checkPhoneNumber(String number){
        String regEx = "1(39|38|37|36|35|34|47|50|51|52|57|58|59|78|82|83|84|87|88|"+
                "30|31|32|55|56|85|86|45|76|"+
                "33|53|77|73|80|81|89|"+
                "70|71)[0-9]{8}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(number);
        return !matcher.find();
    }

{n,m}对前一个字符/(组合)/[范围]匹配最少n次,最多m次

abc     对abc进行匹配

abc{2}   对c匹配两次     匹配字符串abcc

(abc){2}  对abc匹配两次   匹配字符串abcabc

ab[0123456]{2}  前两位匹配ab,第三位再0-6范围内匹配两次

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值