美文网首页
Android 关于TextView与EditText的一些使用

Android 关于TextView与EditText的一些使用

作者: 三横一竖的王1992 | 来源:发表于2017-11-16 17:17 被阅读0次

    开写前的一些话语

    本人从事Android开发,约莫有一年时间,关于这两个TextView和EditText,这两个常用控件,在大学期间,只有少量的接触,起初觉得还挺简单的,后来在开发中遇到相应的问题,才觉得这两个常用的东西,还是有很多门道的,特此写一小份帖子,供给他人取用。

    1.TextView

    关于这个控件,我分享一些它的相关属性使用,方便大家在自己的项目开发中使用。

    1.1增加显示效果

    1.1.1TextView.setStrikeThruText(boolean strikeThruText)        这个方法,代表是否加删除线
    
    1.1.2TextView.setUnderlineText(boolean underlineText)        这个方法,代表是否设置下划线
    
    1.1.3TextView.setFakeBoldText(boolean fakeBoldText)        这个方法,代表是否设置粗体
    
    1.1.4.TextView.getPaint().setAntiAlias(boolean antiAlias);        这个方法,代表是否开启抗锯齿效果
    

    1.2增加图形设置

    布局中,通过drawableLeft,drawableRight,drawableTop,drawableBottom属性,在文字的上下左右,设置对应的图片

    代码中,可以通过TextView..setCompoundDrawables(null, null, null, null)来设置

    值得注意的是,方法内设置为null,即取消对应方位的图片,一行代码足矣

    若是要在代码中,主动设置图片,则需要加一行:

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

    如此做,应该是为了设置放置图片的宽高,否则的话,高0,宽0的图片设置进来,便没有效果

    完整代码如下:

    Drawable drawable=ContextCompat.getDrawable(R.drawable.icon);    //比getResources方法,更加通用
    
    drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
    
    TextView.setCompoundDrawables(null, null, drawable, null);
    

    1.3代码中设置TextView的长度与内容

    举例:

    如以下代码,number代表区号,mobile代表手机号,因区号和手机号的长度不定,且是从上一个页面传过来的,为了在这个页面显示,突出其颜色值,可以按照以下代码操作,利用首尾文字是固定的特点,利用SpannableStringBuilder与ForegroundColorSpan,去设置截取中间一段,有关于带区号手机号码的数字:

    
    String s = "我们已经给手机号码" + number + " " + mobile + "发送了一个4位数的验证码";
    
    TextView.setText(s);
    
    SpannableStringBuilder builder = new SpannableStringBuilder(TextView.getText().toString());
    
    ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(255, 102, 0));
    
    builder.setSpan(span, 9, s.length() - 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    TextView.setText(builder);
    

    1.4TextView与定时器的结合

    举例:

    
        private int   nTimer = 0;
        private Timer timer  = null;
        TimerTask timeTask = null;
    
        private void startTimeCountdown() {
            nTimer = 60;
            updateCountdownButtonUI();
            timer = new Timer();
            timeTask = new TimerTask() {
                @Override
                public void run() {
                    handler.sendEmptyMessage(1);
                }
    
            };
    
            timer.schedule(timeTask, 1000, 1000);
        }
    
        private void stopTimeCountdown() {
            if (timeTask != null) {
                timeTask.cancel();
                timeTask = null;
            }
            if (timer != null) {
                timer.cancel();
                timer = null;
            }
            nTimer = 0;
            updateCountdownButtonUI();
        }
    
        Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    nTimer--;
                    if (nTimer == 0) {
                        stopTimeCountdown();
                    } else
                        updateCountdownButtonUI();
                }
    
                super.handleMessage(msg);
            }
        };
    
        private void updateCountdownButtonUI() {
            if (nTimer > 0) {
                TextView.setText("重新发送(" + String.format("%d", nTimer) + ")");
                TextView.setTextColor(Color.rgb(189, 189, 189));
                TextView.setEnabled(false);
            } else {
                 TextView.setText("重新发送");        //.setText()是设置TextView内容的方法
                 TextView.setTextColor(Color.rgb(255, 102, 0));        //.setTextColor()是设置TextView颜色的方法
                 TextView.setEnabled(true);        //setEnabled()是设置TextView是否可以响应触摸事件
            }
        }
    

    以上代码,从进入这个页面后,在protected void onCreate(Bundle savedInstanceState){},便调用startTimeCountdown();方法,即可将TextView置为不可点击,且初始60秒,会在定时器的作用下,开始倒数,每隔一秒钟,数字减1,直到mTime不在大于零,便改变TextView的文字、颜色,以及让其可点击。

    而在再度点击完按钮后,除了请求接口发送短信以外,在调用startTimeCountdown();方法,便可以实现循环。

    如此一来,一个限时一分钟,才能发送一次的短信验证码TextView,就实现了。

    注:setEnabled() 和 setClickable():

    这两个方法是有区别的

    前者,setEnabled()设置为false,包括触摸事件,都不会被响应

    后者,setClickable()设置为false,还可以响应触摸事件,且在源码中,若是调用setOnclickListener()方法,会自动把setClickable()从false置为true

    2.EditText

    2.1关于EditText的一些基础设置

    2.1.1下划线的设置

    在布局中,可以设置android:background="@null",这是代表去掉下划线的

    若是你想要设置不同颜色的下划线,改变这个参数的设置即可。

    2.1.2设置光标颜色

    可以在布局中,设置这个参数android:textCursorDrawable

    2.1.3获取焦点

    
    EditText.setFocusable(true);
    
    EditText.setFocusableInTouchMode(true);
    
    EditText.requestFocus();
    

    2.2inputtype属性

    指代的是,edittext控件,可输入的类型,种类有很多,下面列举最常用的几种:

    android:inputType="text"//输入类型为普通文本
    
    android:inputType="number"//输入类型为数字文本
    
    android:inputType=”phone”//输入类型为电话号码
    
    android:inputType="textPassword"//输入一个密码
    

    注:代码中也可设置

    配合checkbox等控件,可以实现类似于密码的显示与隐藏效果,代码如下:

        public void onHideOrShow() {
            if (hide_or_show.isChecked()) {
                et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                et_password.setSelection(et_password.getText().length());
            } else {
                et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                et_password.setSelection(et_password.getText().length());    //可让在点击切换的过程中,光标一直处于末尾处
            }
        }
    

    效果如下图:

    image image

    2.3禁用复制粘贴功能

    Android SDK 23 即6.0以前,想要禁用EditText的复制粘贴功能,只需:EditText.setLongClickable(false);禁用其长按点击事件即可

    Android SDK 23 即6.0以后,光是禁用EditText的长按点击事件,还不够:

    还需:

           et.setCustomInsertionActionModeCallback(new ActionMode.Callback() {
                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    return false;
                }
    
                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    return false;
                }
    
                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    return false;
                }
    
                @Override
                public void onDestroyActionMode(ActionMode mode) {
    
                }
            });
    

    注:因为这个方法,是6.0以后才出现的,为了避免报java.lang.NoSuchMethodError:的错误,考虑到兼容性,使用这个监控方法前,最好是做一个判断,即:

    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
    ……
    
    }
    

    2.4输入长度的限制

    若是想要限制EditText所能够输入的长度,可以在代码或布局中设置相关属性,即:

    布局中,设置android:maxLength=""

    代码中,设置editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(???)});

    完了么?

    并没有。

    上述方法,在大多数情况下,已经可以适用了。

    可若是遇上可以输入中文的地方,且还需要限制,比如说,设置昵称时,以上方法,就不够用了。

    因为,在计算机底层语言中,一个汉字是等于两个字符的,但,实际情况,在edittext的输入过程中,汉字与字母、数字的比例,仍是一比一比一

    为了匹配一些要求,比如说昵称输入,可以监控.addTextChangedListener方法,如下代码所示:

    举例:

     final Pattern pa = Pattern.compile("^[\\u4e00-\\u9fa5]*$");      //匹配汉字的正则表达式
            et_nick.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) {
                    String temp = et_nick.getText().toString();
                    char[] textChar = temp.toCharArray();
                    int num = 0;
                    for (int i = 0; i < temp.length(); i++) {
                        if ((pa.matcher(textChar[i] + "")).find()) {
                            num += 2;
                        } else {
                            num += 1;
                        }
                        if (num >= 17) {
                            if (num == 18 || num == 17) {
                                et_nick.setText(temp.substring(0, i));
                                Toast.makeText(mContext, "昵称最多输入8个汉字或16个字符", Toast.LENGTH_SHORT).show();
                            } else {
                                //Log.e("TAG",num+"----------------------");
                            }
                            break;
                        }
                    }
                    et_nick.setSelection(et_nick.getText().length());
                }
            });
    

    2.5软键盘的调取和关闭

    在一些页面,需要在一进来时,便获取EditText的焦点,并弹出软键盘,要实现这个效果,需要在AndroidManifest.xml做相关的配置,即:

        <activity
                android:name=""
                android:configChanges="orientation|screenSize|keyboardHidden"
                android:launchMode="singleTask"
                android:screenOrientation="portrait"
    
                android:windowSoftInputMode="stateVisible|adjustPan" />
    

    关键代码,应该是最后一行代码。

    至于,在代码中跳转到下一个页面,手动关闭软键盘的代码,如下:

    //如果显示输入框就关闭
    
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
            }
    

    2.6关于EditText最后的一些补充

    2.6.1

       EditText.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
                        return true;
                    }
                    return false;
                }
            });
    

    此方法,可监控软键盘是否按下、删除,可在其中做一些操作,返回true表示相应,返回false表示不响应

    2.6.2

    有些时候,对于edittext的输入,会做一定的要求,比如说必须数字,必须字母,必须大写之内的,下面提供一个,必须包含两种不同字符,即数字、字母,特殊字符,至少有其二的一个方法:

        public static boolean isContain(String str) {
            boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
            boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
            boolean isOther = false;//定义一个boolean值,用来表示是否包含字符
    
            for (int i = 0; i < str.length(); i++) {
                if (Character.isDigit(str.charAt(i))) {   //用char包装类中的判断数字的方法判断每一个字符
                    isDigit = true;
                } else if (Character.isLetter(str.charAt(i))) {  //用char包装类中的判断字母的方法判断每一个字符
                    isLetter = true;
                } else {
                    isOther = true;
                }
            }
            boolean isRight = (isDigit && isLetter) || (isDigit && isOther) || (isLetter && isOther);
            return isRight;
        }
    

    总结

    在参加工作的这一年里,我感觉自己学到了很多,从一开始的懵懵懂懂,到现在,是越来越自信了。

    而关于我以上所述的,其实通过百度、google,都是可以找到的,在技术这一路上,不管是Android,还是其他语言,需要的是独立自主解决问题的能力,学会学习,你才能在这条路上走得更远,最后,祝你我都能成为更好的Android开发人员。

    相关文章

      网友评论

          本文标题:Android 关于TextView与EditText的一些使用

          本文链接:https://www.haomeiwen.com/subject/rhfrvxtx.html