欢迎光临散文网 会员登陆 & 注册

android studio EditText的多种需求处理

2023-06-14 13:26 作者:翼618  | 我要投稿

EditText 用到的地方也很多,也经常会有一些细节要求,这里把一些我遇到过的问题记录一下


只能输入 数字和英文 限制  直接在xml里面写就好了

android:digits是可输入文字内容  inputType是类型 两者可以拆开用

android:inputType="number"

android:digits="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"


EditText  输入类型

android:inputType="numberDecimal" 输入金额


android:singleLine="true" //禁止输入回车


自动换行 

android:inputType="textMultiLine"  



EditText  无法编辑

android:focusable="false"


缩回输入法

InputMethodManager m = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);

m.hideSoftInputFromWindow(Et_search.getWindowToken(), 0);//比如EditView

--------------------------------------------------我是分割线-----------------


editText是控件,这里是java代码 对应的xml应该也有

editText.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线

editText.getPaint().setAntiAlias(true);//抗锯齿

editText.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG); //中划线

editText.setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);  // 设置中划线并加清晰 

editText.getPaint().setFlags(0);  // 取消设置的的划线


--------------------------------------------------我是分割线-----------------


    /**

     * 排除特殊字符 和空格之类的东西 只能输入 英文和 中文  EditText 

     */

    public void setIfSpecialCharacters(final EditText ed) {

        //ed.setOnClickListener(this);  // 有些要用的

        ed.addTextChangedListener(new TextWatcher() {

            @Override

            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

                // TODO Auto-generated method stub

                String va = ed.getText().toString();

                if (va.length() > 0) {

                    String reg = "[^a-zA-Z\u4E00-\u9FA5]";

                    if (va.replaceAll(reg, "").length() < va.length()) {

                        ed.setText(Util.ReString(va));

                    }

                }

                System.out.println(Util.ReString(va));

                ed.setSelection(ed.getText().length());

            }


            @Override

            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,

                                          int arg3) {

                // TODO Auto-generated method stub

            }


            @Override

            public void afterTextChanged(Editable arg0) {

                // TODO Auto-generated method stub

            }

        });

    }


--------------------------------------------------我是分割线-----------------

  /**

     * 验证中文

     *

     * @param chinese 中文字符

     * @return 验证成功返回true,验证失败返回false

     */

    public static boolean checkChinese(String chinese) {

        String regex = "^[\u4E00-\u9FA5]+$";

        return Pattern.matches(regex, chinese);

    }

--------------------------------------------------我是分割线-----------------

EditText  在addTextChangedListener 里面操作的时候出现异常

的处理方法   

通过移除焦点和 添加焦点 解决递归操作问题  打比方说要清空掉用户输入的东西 就会有递归的问题了


/**设置空数据  去除焦点!!!!!*/

et_content.removeTextChangedListener(this);  


/**收起键盘*/

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

holder.et_content.setText("");


/**设置空数据后 把焦点加回来 核心代码 */

holder.et_content.addTextChangedListener(this);

--------------------------------------------------我是分割线-----------------

Editview重写

et_searchData.addTextChangedListener(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) {

    }

});

--------------------------------------------------我是分割线-----------------


/**

 * 禁止EditText输入特殊字符

 * @param editText

 */

public static void setEditTextInhibitInputSpeChat(EditText editText){


    InputFilter filter=new InputFilter() {

        @Override

        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            String speChat="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";

            Pattern pattern = Pattern.compile(speChat);

            Matcher matcher = pattern.matcher(source.toString());

            if(matcher.find())return "";

            else return null;

        }

    };

    editText.setFilters(new InputFilter[]{filter});

}


--------------------------------------------------我是分割线-----------------

//监听输入框禁止输入空格

Et_search.addTextChangedListener(new TextWatcher() {

    @Override

    public void onTextChanged(CharSequence s, int start, int before,

                              int count) {


        if (s.toString().contains(" ")) {

            String[] str = s.toString().split(" ");

            String str1 = "";

            for (int i = 0; i < str.length; i++) {

                str1 += str[i];

            }

            Et_search.setText(str1);

            Et_search.setSelection(start);

        }

    }


    @Override

    public void beforeTextChanged(CharSequence s, int start, int count,

                                  int after) {

    }

    @Override

    public void afterTextChanged(Editable s) {

    }

});

------------------------------------------------我是分割线-------------------

只能输入中文 的EditText 

    public void setEd(EditText et_chinese){

        //输入过滤器可以实现很多效果

        InputFilter filter = new InputFilter() {public CharSequence filter(CharSequence source, int start, int end,

                                                                           Spanned dest, int dstart, int dend) {

                for (int i = start; i < end; i++) {

                    if (!isChinese(source.charAt(i))) {

                        return "";

                    }

                }

                return null;

            }

        };

        et_chinese.setFilters(new InputFilter[]{filter});

        //如果想要再实现输入字符数量的限制,可以这么写,如果限制字符数为6,就在LengthFilter中传入参数6

        //et_chinese.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(6)});


    }


    /**

     * 判定输入汉字,通过Unicode表

     *

     * @param c

     * @return

     */

    public boolean isChinese(char c) {

        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);

        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS

                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS

                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A

                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION

                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION

                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {

            return true;

        }

        return false;

    }

------------------------------------------------我是分割线-------------------

2018 年的手机号码正则 ,这里只是举个粒子,你可以去搜今年的最新正则来用,匹对手机号码还是狠常用的

^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$

------------------------------------------------我是分割线-------------------

 默认不打开输入法

 在清单文件设置,这个还是狠常用的

 android:windowSoftInputMode="adjustUnspecified|stateAlwaysHidden"

------------------------------------------------我是分割线-------------------

//        弹出输入框  也有要弹出的,比较少 不过姑且也放出来把 直接调用无效,估计是异步的问题

        new Handler().postDelayed(new Runnable(){

            public void run() {

                InputMethodManager inputManager = (InputMethodManager) getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);

                inputManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

            }

        }, 300);

------------------------------------------------我是分割线-------------------

// 键盘状态判断

 InputMethodManager imm = (InputMethodManager) PieChartDetailActivity.this.getSystemService(PieChartDetailActivity.this.INPUT_METHOD_SERVICE);

        if (imm.hideSoftInputFromWindow(v.getWindowToken(), 0)) {

            imm.showSoftInput(v, 0);

            Log.d("PieChartDetailActivity", "软键盘已弹出");

            //软键盘已弹出

        } else {

            Log.d("PieChartDetailActivity", "软键盘未弹出");

            //软键盘未弹出

        }

------------------------------------------------我是分割线-------------------

密码框设置

显示内容

editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

加密内容

editText.setInputType(0x00000080);

------------------------------------------------我是分割线-------------------


光标位置移动 需要在子线程中运行 

//    子线程调用

     Timer timer = new Timer();

     timer.schedule(new MyTask(), 1);


    //    调用运行更新 方法

    private class MyTask extends TimerTask {

        @Override

        public void run() {

            Message message = new Message();

            message.what = 1;

            mHandler.sendMessage(message);

        }

    }


    //    子线程

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {

            //    更新UI操作

//            移动光标位置

            CharSequence text = editTextUserpassword.getText();

            if (text instanceof Spannable) {

                Spannable spanText = (Spannable) text;

                Selection.setSelection(spanText, text.length());

            }

        }

    };

------------------------------------------------我是分割线-------------------

这里是处理那些带个小图标的editText ,可能看着不直观,参考一下就好

editText 焦点 兼左边图标处理设置  就输入密码 左边的小图标也要跟着变换


        nav_up = getResources().getDrawable(R.drawable.password1_green);

        nav_up1 = getResources().getDrawable(R.drawable.password1);

        nav_up.setBounds(0, 0, nav_up.getMinimumWidth(), nav_up.getMinimumHeight());

        nav_up1.setBounds(0, 0, nav_up1.getMinimumWidth(), nav_up1.getMinimumHeight());

        

        editText1.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {

            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)

            @Override

            public void onFocusChange(View v, boolean hasFocus) {

                if (hasFocus) {

// 此处为得到焦点时的处理内容

                    editText1.setBackground(getResources().getDrawable(R.drawable.border_bootm));

                    editText1.setCompoundDrawables(nav_up, null,null , null);

                } else {

// 此处为失去焦点时的处理内容

                    editText1.setBackground(getResources().getDrawable(R.drawable.border_bootm_gray));

                    editText1.setCompoundDrawables(nav_up1, null,null , null);

                }

            }

        });

------------------------------------------------我是分割线-------------------

    /**

     * 显示键盘

     *

     * @param et 输入焦点

     */

    public void showInput(final EditText et) {

        et.requestFocus();

        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

        imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);

    }

 

    /**

     * 隐藏键盘

     */

    protected void hideInput() {

        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

        View v = getWindow().peekDecorView();

        if (null != v) {

            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

        }

    }


android studio EditText的多种需求处理的评论 (共 条)

分享到微博请遵守国家法律