Android TextInputLayout,打造 Material Design 风格的文本输入框
2016-11-28 16:34
726 查看
Android Material Design 对 EditText 输入框的交互设计定义了一个规范,详细设计细节可以参考官网介绍:Components/Text fields (需要 翻墙 )。android.support.design 包中恰好提供了一个实现这些设计细节的新控件:TextInputLayout,本文就来细细分析一下。
相比传统单独使用 EditText 的做法,新增的容器
hint 提示:输入框获取焦点时,EditText 通过 hint 属性设置的字符串内容将浮动显示在输入框左上方。用户进行输入操作时依旧能够看到提示信息。
error 提示:通常用户输入的内容需要经过验证,可以使用
character counter:通过
Password visibility toggling:当输入框内容为密码类信息时,可以通过
这里我写了一个测试 Demo,layout 文件内容如下:
效果如图:
前面提到的 TextInputLayout 的四个功能在 Demo 中均有所体现。再补充几个值得注意的地方:
浮动 hint 、error 提示、字数提示和 EditText 的背景样式默认使用主题 style 中的
使用
控制密码显示状态的切换按钮的图标默认呈黑色眼睛状,TextInputLayout 提供了一些属性供开发人员自由设置其颜色与形状。比如「Nick Butcher」大神在他的项目 plaid 中利用 path 给图标做出了一个很炫酷的切换动画效果,再加上文字和小黑点的切换效果,简直完美,如下图所示 (图片源自 Twitter):
具体代码实现过程,可以直接参考:Plaid - Animated DN password visibility toggle。
TextInputEditText 是 AppCompatEditText (继承自 EditText) 的子类,源码很简单,只是重写 onCreateInputConnection 方法,做了一个 hint 信息的传递,就是为了在「extract mode」中显示 hint 信息:
使用时,只需要将 TextInputLayout 中的 EditText 替换成 TextInputEditText 控件即可,属性和 EditText 一样,没有什么其他特殊用法,我们看一下效果图。
TextInputLayout 与 EditText:
TextInputLayout 与 TextInputEditText:
备注:如果不想使用 EditText 的「extract mode」,添加
特殊说明:经测试发现,在目前最新版本 25.0.0 的 design 包中,TextInputLayout 与 TextInputEditText 的组合使用不能实现「extract mode」显示 hint 功能,而在旧版本中能够实现,比如 24.1.1 版本。目测这是新版 Design 包的一个 Bug,期待下个版本的修复吧。
最后,附上「Android Material Design」系列文章的 Demo 地址:MDStudySamples,欢迎 Star。
本文由 亦枫 创作并首发于 亦枫的个人博客 ,同步授权微信公众号:技术鸟(NiaoTech)。
欢迎各种形式地交流与转载,注明作者及出处即可。
本文标题为: Android TextInputLayout,打造 Material Design 风格的文本输入框
本文链接为:http://yifeng.studio/2016/11/28/android-textinputlayout/
TextInputLayout
LinearLayout 的子类,专用于包裹 EditText 的一个 ViewGroup ,基本用法如下:<android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/form_username"/> </android.support.design.widget.TextInputLayout>
相比传统单独使用 EditText 的做法,新增的容器
TextInputLayout拥有的一些独特属性能够实现如下功能:
hint 提示:输入框获取焦点时,EditText 通过 hint 属性设置的字符串内容将浮动显示在输入框左上方。用户进行输入操作时依旧能够看到提示信息。
error 提示:通常用户输入的内容需要经过验证,可以使用
TextInputLayout类提供的
setErrorEnabled(boolean)和
setError(CharSequence)方法控制输入框左下方错误信息的显示与隐藏。
character counter:通过
counterEnabled和
counterMaxLength属性可以统计输入内容的字数,并显示在输入框右下角。
Password visibility toggling:当输入框内容为密码类信息时,可以通过
passwordToggleEnabled属性或者
setPasswordVisibilityToggleEnabled(boolean)方法在输入框右侧 drawableRight 的位置显示一个切换按钮,控制输入内容的显示与隐藏。
这里我写了一个测试 Demo,layout 文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:focusableInTouchMode="true" android:orientation="vertical"> <include layout="@layout/include_toolbar"/> <android.support.design.widget.TextInputLayout android:id="@+id/til_mobile" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_16" android:layout_marginLeft="@dimen/dp_16" android:layout_marginRight="@dimen/dp_16" app:counterEnabled="true" app:counterMaxLength="11"> <android.support.design.widget.TextInputEditText android:id="@+id/et_mobile" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableLeft="@mipmap/ic_mobile" android:drawableStart="@mipmap/ic_mobile" android:drawablePadding="@dimen/dp_4" android:gravity="center_vertical" android:inputType="number" android:hint="请输入手机号"/> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/til_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp_16" android:layout_marginLeft="@dimen/dp_16" app:passwordToggleEnabled="true"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableLeft="@mipmap/ic_password" android:drawableStart="@mipmap/ic_password" android:drawablePadding="@dimen/dp_4" android:gravity="center_vertical" android:hint="请输入密码" android:inputType="textPassword"/> </android.support.design.widget.TextInputLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/dp_16" android:onClick="onClickLogin" android:text="登录" android:textColor="@color/white" android:textSize="@dimen/sp_16" android:background="@color/blue"/> </LinearLayout>
效果如图:
前面提到的 TextInputLayout 的四个功能在 Demo 中均有所体现。再补充几个值得注意的地方:
浮动 hint 、error 提示、字数提示和 EditText 的背景样式默认使用主题 style 中的
colorAccent属性定义的颜色;
使用
TextInputLayout时,设置 EditText 的 drawable 图标时需要同时使用相对值 (start/end) 和 绝对值 (left/right),否则 drawable 存在显示兼容问题。
控制密码显示状态的切换按钮的图标默认呈黑色眼睛状,TextInputLayout 提供了一些属性供开发人员自由设置其颜色与形状。比如「Nick Butcher」大神在他的项目 plaid 中利用 path 给图标做出了一个很炫酷的切换动画效果,再加上文字和小黑点的切换效果,简直完美,如下图所示 (图片源自 Twitter):
具体代码实现过程,可以直接参考:Plaid - Animated DN password visibility toggle。
TextInputEditText
默认情况下,当设备处于横屏时,点击 EditText 输入框,会弹出一个新的输入界面并显示软键盘,即 「extract mode」(全屏模式),而不是在当前界面弹出软键盘。如果单独使用 EditText,进入「extract mode」并且在用户还没输入任何内容时,hint 信息会显示在输入框中。但是 EditText 和 TextInputLayout 一起使用时,hint 信息则不会显示。而 TextInputEditText 的出现刚好解决了这个问题。TextInputEditText 是 AppCompatEditText (继承自 EditText) 的子类,源码很简单,只是重写 onCreateInputConnection 方法,做了一个 hint 信息的传递,就是为了在「extract mode」中显示 hint 信息:
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { final InputConnection ic = super.onCreateInputConnection(outAttrs); if (ic != null && outAttrs.hintText == null) { // If we don't have a hint and our parent is a TextInputLayout, use it's hint for the // EditorInfo. This allows us to display a hint in 'extract mode'. final ViewParent parent = getParent(); if (parent instanceof TextInputLayout) { outAttrs.hintText = ((TextInputLayout) parent).getHint(); } } return ic; }
使用时,只需要将 TextInputLayout 中的 EditText 替换成 TextInputEditText 控件即可,属性和 EditText 一样,没有什么其他特殊用法,我们看一下效果图。
TextInputLayout 与 EditText:
TextInputLayout 与 TextInputEditText:
备注:如果不想使用 EditText 的「extract mode」,添加
android:imeOptions="flagNoExtractUi"属性即可。
特殊说明:经测试发现,在目前最新版本 25.0.0 的 design 包中,TextInputLayout 与 TextInputEditText 的组合使用不能实现「extract mode」显示 hint 功能,而在旧版本中能够实现,比如 24.1.1 版本。目测这是新版 Design 包的一个 Bug,期待下个版本的修复吧。
最后,附上「Android Material Design」系列文章的 Demo 地址:MDStudySamples,欢迎 Star。
本文由 亦枫 创作并首发于 亦枫的个人博客 ,同步授权微信公众号:技术鸟(NiaoTech)。
欢迎各种形式地交流与转载,注明作者及出处即可。
本文标题为: Android TextInputLayout,打造 Material Design 风格的文本输入框
本文链接为:http://yifeng.studio/2016/11/28/android-textinputlayout/
相关文章推荐
- Android TextInputLayout,打造 Material Design 风格的文本输入框
- TextInputLayout,打造材料设计风格的文本输入框
- Material Design风格文本输入样式TextInputLayout的使用
- Material Design之输入框TextInputLayout的使用
- Android Design新控件之TextInputLayout(文本输入布局)
- Android Material Design系列之TextInputLayout
- Android Material Design--TextInputLayout
- Android TextInputLayout更好看的输入框加EvenBus传值
- Android Material Design之TextInputLayout
- Android Design包下的TextInputLayout可以快速实现输入框效果
- Android Design风格组件之TextInputLayout
- Android Material Design之TextInputLayout
- Android Material Design之TextInputLayout
- Android Material Design 之 TextInputLayout
- Android中Material Desgin风格的Snackbar、TextInputLayout、FloatingActionButton使用
- Android Material Design 之TextInputLayout TextInputEditText
- Android:Material Design之TextInputLayout使用
- <Android 基础(十二)> TextInputLayout,让输入框更有灵性
- 浅析Android Material Design之TextInputLayout
- Android Design新控件之TextInputLayout(文本输入布局)