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

效果如下图:

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开发人员。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容