Android Design Support Library系列之三:TextInputLayout的使用

滴滴滴9527IP属地: 浙江
字数 772阅读 1,237

EditText作为Android中最常用的组件之一,相信很多人对它都很熟悉,EditText有一个属性hint,能提示我们输入什么信息,当用户在EditText输入文字时,hint属性提示的文字就消失了。
说到这,就要介绍今天的主角TextInputLayout了,使用TextInputLayout能让hint属性提示的文字在用户输入时不消失,而是显示为EditText上方的浮动标签。


TextInputLayout官方文档

一、TextInputLayout的简单使用

惯例,使用前先添加依赖

dependencies {
    compile 'com.android.support:design:25.3.1'
}

TextInputLayout继承自LinearLayout,是一个容器。跟ScrollView只能嵌套一个子元素特性一样,TextInputLayout也只接受一个子元素。子元素需要是一个EditText

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/textInputLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Username"
            android:inputType="textEmailAddress" />

    </android.support.design.widget.TextInputLayout>


    <EditText
        android:id="@+id/et_normal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Normal"
        android:inputType="textEmailAddress" />

</LinearLayout>

上面的布局文件中有2个EditText,都声明了hint属性,其中一个EditText用
TextInputLayout包裹了,另外一个没有.
PS: 其实hint属性直接设置给TextInputLayout也是可以的

来看看效果图:


我们可以看到,一个单一的EditText 在输入文字的时候会隐藏hint提示的文本,而被包含在TextInputLayout中的EditText则会让hin提示的文本变成一个在EditText上方的浮动标签,同时还包括一个漂亮的material动画。

关于Android Design Support Library主题

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

我们在AndroidStudio中创建项目时,系统在res/values/style.xml中的主题一般向上面这样,大多数时候我们只是在这里去除ActionBar:

Theme.AppCompat.Light.NoActionBar

Material Design设计语言鼓励大家使用充满活力的鲜艳色彩,并在同一界面建议使用三种色调,Android Design Support Library中每个控件的设计颜色都来自 style.xml 中 theme 指定的三种颜色。
在此处,我们通过修改 colorAccent 属性便可以指定 TextInputLayout 的浮动标签的字体颜色以及 EditText 的下划线颜色。

 <item name="colorAccent">@android:color/holo_blue_dark</item>

二、TextInputLayout的一些属性、方法

属性

android:hint=""    直接把hint属性设置给TextInputLayout也是可以的
android:textColorHint=""  hint提示内容的颜色(在下划线上时)
app:hintEnabled="true"    设置是否可以使用hint属性,默认是true
app:hintAnimationEnabled="false"      控制hint提示信息的动画是否开启
app:hintTextAppearance=""   设置hint提示文本(在浮动标签时)的样式(大小、颜色等等)
app:errorTextAppearance=""  设置错误信息文本的样式(大小、颜色等等)

方法

getEditText()    返回TextInputLayout包裹的EditText
getHint()     返回TextInputLayout包裹的EditText中的hint信息
setHint()     设置TextInputLayout包裹的EditText中的hint信息
setError()            设置错误显示信息
setErrorEnabled()        设置错误信息是否显示,true显示,false不显示

当然,Android中的属性和方法一般是一一对应的,你既可以在布局文件中设置,也可以通过代码设置。

三、TextInputLayout处理错误

在以前,我们一般都是在提交信息时才检验EditText中内容格式正不正确,如果用户输入了一大堆信息之后你再提示用户输入的格式不正确,这是一种很糟糕的体验。

而用TextInputLayout处理错误,可以实时验证EditText的内容,反馈结果给用户,防止用户输入无效的、错误的信息。

public class MainActivity extends AppCompatActivity {

    private EditText etName;
    private TextInputLayout mTextInputLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etName = (EditText) findViewById(R.id.et_name);
        mTextInputLayout = (TextInputLayout) findViewById(R.id.textInputLayout);

        /**
         * 为EditText 添加文本内容改变时的监听
         */
        etName.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) {
                if (s.length() < 6) {
                    mTextInputLayout.setErrorEnabled(true);
                    mTextInputLayout.setError("用户名不能小于6位");
                } else {
                    mTextInputLayout.setErrorEnabled(false);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }
}

在EditText 内容发生改变时,我们通过判断EditText 内容来提示用户,这里我判断EditText 内容长度是否小于6,当然,你完全可以在这里通过正则表达式判断更多的东西.



可以看到,在EditText 内容不正确的时候,下方有一个错误信息显示,同时EditText 的下划线变成红色,这样就能实时的提示用户输入的内容是否正确了.

TextInputLayout使用比较简单,就介绍到这里,现在市场上有这种效果的app不是很多,不过相信在以后这种效果的app会慢慢变多的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
更多精彩内容,就在简书APP
"小礼物走一走,来简书关注我"
还没有人赞赏,支持一下
总资产11共写了3.2W字获得514个赞共201个粉丝

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • 引言 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给...
    李牧羊阅读 2,273评论 3 4
  • Android Design Support Library使用详解 Google在2015的IO大会上,给我们带...
    eclipse_xu阅读 2,573评论 5 25
  • 潇潇洒洒又一天,日子如炊烟般弥漫整个花季。人生如电影,戏如人生。每个人拿到手头的剧本可以相同,但演绎的角色却各有千...
    毛柒灵阅读 203评论 0 1
  • 好像大梦一场,到了醒来的时候了。从来没有过的疯狂,都过去了,没有后悔更没有遗憾,感谢这次华丽的冒险,让我认识了一个...
    dearanny阅读 160评论 3 2