Android 关于TextView与EditText的一些使用小技巧

开写前的一些话语

本人从事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());    //可让在点击切换的过程中,光标一直处于末尾处
        }
    }

效果如下图:

Android 关于TextView与EditText的一些使用小技巧_第1张图片
image
Android 关于TextView与EditText的一些使用小技巧_第2张图片
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做相关的配置,即:

    

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

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

//如果显示输入框就关闭

 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的一些使用小技巧)