MaterialDesign--(5)TextInputLayout 的使用以及如何阅读源码

能学到什么?

1.TextInputLayout 的使用
2.TextInputLayout 的所有属性
3.如何阅读 TextInputLayout 源码来实现自己想要的效果,遇到这类控件再也不用去百度了~~


老规矩,先上图。

TextInputLayout.gif

如何用?

在创建项目的时候选择Login Activity即可得到上图的效果

TextInputLayout.png

xml 结构如下

xml 结构.png

就是在 EditText 外包裹了一个 TextInputLayout 布局,就像穿了一件衣服一样。百度随便一搜,就能搜到很多 TextInputLayout 的使用方法。
等等,刚刚说什么?百度一搜,作为程序员,要使用一个系统控件去搜百度会不会有点 low?可能有朋友会说,这还不简单,我 Google 不就行了么。不不不,我不是这个意思,其实我们可以通过看通过源码来学习怎样使用这个控件呀。
好了,不闲聊了,滴滴滴~~~

滴滴滴.png

首先,我们是知道这个控件大致有哪些功能的,那么我们就先去找它的 attrs 属性,然后再对比TextInputLayout的方法。TextInputLayout的源码差不多有1500,有点多,作为一个比较会偷懒的程序员,肯定是不想一行一行代码去捋逻辑,但是我们又想知道 TextInputLayout 的所有可定制的功能,怎么办?
看过设计模式的童鞋们都知道,一共有23种设计模式,而这23种设计模式都遵循了面向对象的六大原则(有些说法是七大原则,我不 care 这个),其中有一条原则叫:“开闭原则 OCP”。

开闭原则(OCP:Open Closed Principle)
核心思想:对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。

TextInputLayout在 design 包下,是 Google 发布的,代码规范性自然不用说,所以我们只需要关心 public 方法即可。

attrs 属性

我们在 design 包的 res> value 文件里面搜索一下 TextInputLayout 可以找到以下代码

<declare-styleable name="TextInputLayout">
 <attr format="reference" name="hintTextAppearance"/>
 <attr name="android:hint"/>
 <attr format="boolean" name="hintEnabled"/>
 <attr format="boolean" name="errorEnabled"/>
 <attr format="reference" name="errorTextAppearance"/>
 <attr format="boolean" name="counterEnabled"/>
 <attr format="integer" name="counterMaxLength"/>
 <attr format="reference" name="counterTextAppearance"/>
 <attr format="reference" name="counterOverflowTextAppearance"/>
 <attr name="android:textColorHint"/>
 <attr format="boolean" name="hintAnimationEnabled"/>
 <attr format="boolean" name="passwordToggleEnabled"/>
 <attr format="reference" name="passwordToggleDrawable"/>
 <attr format="string" name="passwordToggleContentDescription"/>
 <attr format="color" name="passwordToggleTint"/>
 <attr name="passwordToggleTintMode">
        <enum name="src_over" value="3"/>
        <enum name="src_in" value="5"/> 
        <enum name="src_atop" value="9"/> 
        <enum name="multiply" value="14"/>
        <enum name="screen" value="15"/>
    </attr>
</declare-styleable>

好了,其实光看名字,就能猜出这个属性是干嘛的了,为了避免有些同学写错,我这里一张图让你看明白。好烦呀,又要去 ps 图片~~~~

attrs.png

TextInputLayout 的 public 方法

直接看类结构图,不知道类结构图在哪的请看下图绿色箭头

TextInputLayout Structure.png

TextInputLayout 暴露出来的public 方法基本和 attrs 的属性对的上。

  • typeface
  • setTypeface(Typeface)设置 hint 等字体
  • getTypeface(Typeface)获取 hint 等字体
  • editText
  • getEditText() 获取子控件 EditText
  • hint
  • setHint(CharSequence)设置 hint 文字
  • getHint()获取 hint 文字
  • hintEnable
  • setHintEnable(boolean)设置是否显示 hint
  • isHintEnable() 获取是否显示 hint
  • hintTextAppearance
  • setHintTextAppearance() 设置 hint 文本颜色
  • errorEnable
  • setErrorEnable()设置是否显示错误提示
  • isErrorEnable();获取是否显示错误提示
  • ErrorTextAppearance
  • setErrortextAppearance(int) 设置错误提示样式
  • error
  • setError(charSequence)设置错误提示文本 不可以通过 attrs 属性设置
  • getError();获取错误提示文本
  • counterEnable
  • setCounterEnable(boolean)设置计数器开关
  • isCounterEnable() 获取是否打开计数器
  • counterMaxLength
  • setCounterMaxLength(int)设置计数器最大文本长度
  • getCounterMaxLength(); 获取计数器设置的最大文本长度
  • hintAnimationEnable
  • setHintAnimationEnable(boolean) 设置是否显示 hint 动画
  • isHintAnimationEnable() 获取 hint 动画是否打开
  • passwordVisiblityToggleDrawable系列
  • setPasswordVisiblityToggleDrawable(Drawable)设置密码可见开关图片
  • getPasswordVisiblityToggleDrawable()虎丘密码可见开关图片
  • setPasswordVisiblityToggleEnable(boolean)设置密码可见开关是否可用
  • isPasswordVisiblityToggleEnable()获取密码可见开关是否可用
  • setPasswordVisiblityToggleTintList(ColorStateList)设置密码可见开关颜色

这里的方法和上面的 attr 属性名基本上对的上,如果不能通过名字推测功能的话,可以点进源码看方法注释,都有详细说明的。如果看不懂英文文档的,请复制粘贴到这里http://fanyi.baidu.com/

好了,TextInputLayout 就到这里了,没有源码分析,其实也不需要去分析源码,因为我们自己去手撸一个TextInputLayout,其实也是可以撸出来的,就是一个自定义 View,继承 LinearLayout,然后获取里面的 Edittext,设置 hint 动画,然后添加一些关于密码的自定义属性,再加上一个对 EditText 的输入监听显示字数。把上面所有的设置方法暴露出来,最后让这个 View 看起来美观一点。。。。。

结束语

很早以前就知道 TextInputLayout 这个控件,中间也看过几次相关的 blog,自己也用过几次,就是每次用的时候,碰到任何问题都需要去搜 blog,然后搜到的东西还不一定是你想要的,导致效率特别低下。其实关于这些系统控件,直接去看源码才是最便捷的选择。

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

推荐阅读更多精彩内容