TextInputLayout

介绍:

首先来看一下TextInputLayout,TextInputLayout 是EditText(或者EditText子类)的一个包装类,它主要用于在用户输入文本的时候显示一个浮动标签,也支持显示错误信息和字符计数等功能。同样它也支持密码可见切换按钮,通过setPasswordVisibilityToggleEnabled(boolean)API 或者 xml 中的属性,如果设置该属性为可用(enable),那么当EditText 显示设置的密码时,会显示一个切换密码可见和隐藏的按钮。

TextInputLayout 重要方法和属性:
  • app:counterEnabled 字符计数是否可用
    代码中对应的方法为:setCounterEnabled(boolean)
  • app:counterMaxLength 计数最大的长度
    代码中对应的方法为:setCounterMaxLength(int )
  • app:counterOverflowTextAppearance 计数超过最大长度时显示的文本样式
  • app:counterTextAppearance 显示的计数的文本样式。
  • app:errorEnabled 显示错误信息是否可用
  • app:errorTextAppearance 显示错误信息的文本样式
  • android:hint 浮动标签
    代码对应方法:setHint(CharSequence)
  • app:hintAnimationEnabled 控制是否需要浮动标签的动画
    代码对应方法:setHintAnimationEnabled(boolean)
  • app:hintEnabled 控制是否显示浮动标签
    代码对应方法:setHintEnabled(boolean)
  • app:hintTextAppearance 浮动标签的文本样式
    代码对应方法:setHintTextAppearance(int)
  • app:passwordToggleDrawable 密码可见切换图标
    代码对应方法:setPasswordVisibilityToggleDrawable(int)或者setPasswordVisibilityToggleDrawable(Drawable)
  • app:passwordToggleEnabled 控制是否显示密码可见切换图标
    代码对应方法:setPasswordVisibilityToggleEnabled(boolean)
  • app:counterOverflowTextAppearance 设置超出字符数后提示文字的颜色,如果不设置默认为@color/colorAccent的颜色
基础用法:
  <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:hint="账号"
        android:paddingLeft="16dp"
        android:scrollbarAlwaysDrawHorizontalTrack="true"
        app:counterMaxLength="8"
        app:counterOverflowTextAppearance="@style/TextOverCount">

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:textColor="@color/black"
            android:textColorHint="@color/gray"
            android:textSize="14dp"/>
    </android.support.design.widget.TextInputLayout>
修改默认样式:

改变TextInputLayout默认下划线颜色和点击时颜色,默认hint颜色,在TextInputLayout控件设置textColorHint设置默认hint颜色
在EditText控件中设置android:theme属性设置 style

  <android.support.design.widget.TextInputLayout
        android:id="@+id/login_textinput_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="@color/mintcream">
        <!--android:textColorHint" 默认hint字体及下划线颜色-->
        <EditText
            android:id="@+id/login_userId"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入账号"
            android:inputType="number"
            android:maxLines="1"
            android:singleLine="true"
            android:textColor="@color/darkorange"
            android:theme="@style/TextAppTheme" />
        <!--textColor设置输入时字体颜色-->
    </android.support.design.widget.TextInputLayout>
    
   <!--改变TextInputLayout 里面的EditText默认下划线和点击时下划线的颜色-->
    <style name="TextAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorControlNormal">@color/gray</item><!--默认显示下划线的颜色-->
        <item name="colorControlActivated">@color/gray</item><!--点击后下划线的颜色-->
        <item name="colorAccent">@color/qmui_config_color_red</item>
    </style>
超出字符数后的提示样式:
  <style name="TextOverCount" parent="Base.TextAppearance.AppCompat.Light.Widget.PopupMenu.Small">
        <item name="android:textColor">@android:color/holo_red_light</item>
    </style>
设置错误提示文字
<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_marginTop="20dp"
        app:errorEnabled="true" //设置为true
        android:id="@+id/textinputlayout_email"
        android:layout_height="wrap_content">
        <EditText
            android:layout_width="match_parent"
            android:hint="请输入邮箱"
            android:id="@+id/et_email"
            android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>


editText_email=findViewById(R.id.et_email);
        textInputLayout =findViewById(R.id.textinputlayout_email);
        editText_email.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if(!RegexUtils.isEmail(charSequence)){
                    textInputLayout.setError("邮箱格式错误");
                    textInputLayout.setErrorEnabled(true);
                }else {
                    textInputLayout.setErrorEnabled(false);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
image
设置密码是否可见
<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_marginTop="20dp"
        app:errorEnabled="true"
        app:passwordToggleEnabled="true" //设置为true
        android:id="@+id/textinputlayout_password"
        android:layout_height="wrap_content">
        <EditText
            android:layout_width="match_parent"
            android:hint="请输入密码"
            android:id="@+id/et_password"
            android:inputType="textPassword"
            android:layout_height="wrap_content" />
    </android.support.design.widget.TextInputLayout>
image

推荐阅读更多精彩内容