Material Design 之 TextInputLayout和TextInputEditText

寫在前面

更多Material Design 文章請(qǐng)看:
Material Design 之 Toolbar 開發(fā)實(shí)踐總結(jié)
Material Design之 AppbarLayout 開發(fā)實(shí)踐總結(jié)
Material Design 之 Behavior的使用和自定義Behavior
Material Design 之 TabLayout 使用
文本框相信大家都很熟悉,文本框可以讓用戶輸入文本。它們可以是單行的,帶或不帶滾動(dòng)條,也可以是多行的,并且?guī)в幸粋€(gè)圖標(biāo)。點(diǎn)擊文本框后顯示光標(biāo),并自動(dòng)顯示鍵盤。除了輸入,文本框可以進(jìn)行其他任務(wù)操作,如文本選擇(剪切,復(fù)制,粘貼)以及數(shù)據(jù)的自動(dòng)查找功能。這篇文章講的就是Material Design 風(fēng)格的文本框,它有有一些比較炫酷的動(dòng)畫效果(比如輸入的時(shí)候,內(nèi)嵌標(biāo)簽會(huì)浮動(dòng)到內(nèi)容的上方),此外還給我一些特別有用的功能,如錯(cuò)誤提示、計(jì)數(shù)等等。Material Design 風(fēng)格的文本框是用TextInputLayout 和TextInputEditText 兩個(gè)View來實(shí)現(xiàn)的,該類support design 包中。下面就來看一下TextInputLayout 的具體用法。

TextInputLayout 使用

TextInputLayout介紹

首先來看一下TextInputLayout,TextInputLayout 是EditText(或者EditText子類)的一個(gè)包裝類,它主要用于在用戶輸入文本的時(shí)候顯示一個(gè)浮動(dòng)標(biāo)簽,也支持顯示錯(cuò)誤信息和字符計(jì)數(shù)等功能。同樣它也支持密碼可見切換按鈕,通過setPasswordVisibilityToggleEnabled(boolean)API 或者 xml 中的屬性,如果設(shè)置該屬性為可用(enable),那么當(dāng)EditText 顯示設(shè)置的密碼時(shí),會(huì)顯示一個(gè)切換密碼可見和隱藏的按鈕。

注意:當(dāng)使用密碼切換按鈕的時(shí)候,EditText 結(jié)束位置的 圖標(biāo)時(shí)會(huì)被覆蓋的,為了保證EditText 結(jié)束位置Drawable的正常顯示,你需要設(shè)置這些Drawables 的相對(duì)位置( 相對(duì)start的位置/相對(duì)結(jié)束的位置)。

圖標(biāo)覆蓋,如下圖:

override_drawable.png

如上圖所示,切換密碼可見的按鈕(眼睛圖標(biāo))和錯(cuò)誤提示的圖標(biāo) 覆蓋在一起了。

TextInputLayout 重要方法和屬性

來看一下TextInputLayout 的一些重要方法和屬性:

  • app:counterEnabled 字符計(jì)數(shù)是否可用
    代碼中對(duì)應(yīng)的方法為:setCounterEnabled(boolean)

  • app:counterMaxLength 計(jì)數(shù)最大的長(zhǎng)度
    代碼中對(duì)應(yīng)的方法為:setCounterMaxLength(int )

  • app:counterOverflowTextAppearance 計(jì)數(shù)超過最大長(zhǎng)度時(shí)顯示的文本樣式

  • app:counterTextAppearance 顯示的計(jì)數(shù)的文本樣式。

  • app:errorEnabled 顯示錯(cuò)誤信息是否可用

  • app:errorTextAppearance 顯示錯(cuò)誤信息的文本樣式

  • android:hint 浮動(dòng)標(biāo)簽
    代碼對(duì)應(yīng)方法:setHint(CharSequence)

  • app:hintAnimationEnabled 控制是否需要浮動(dòng)標(biāo)簽的動(dòng)畫
    代碼對(duì)應(yīng)方法:setHintAnimationEnabled(boolean)

  • app:hintEnabled 控制是否顯示浮動(dòng)標(biāo)簽
    代碼對(duì)應(yīng)方法:setHintEnabled(boolean)

  • app:hintTextAppearance 浮動(dòng)標(biāo)簽的文本樣式
    代碼對(duì)應(yīng)方法:setHintTextAppearance(int)

  • app:passwordToggleDrawable 密碼可見切換圖標(biāo)
    代碼對(duì)應(yīng)方法:setPasswordVisibilityToggleDrawable(int)或者setPasswordVisibilityToggleDrawable(Drawable)

  • app:passwordToggleEnabled 控制是否顯示密碼可見切換圖標(biāo)
    代碼對(duì)應(yīng)方法:setPasswordVisibilityToggleEnabled(boolean)

TextInputLayout 使用示例

了解了以上的屬性和方法后,我們看一下具體使用:
1,帶浮動(dòng)標(biāo)簽的文本框
代碼如下:

     />
    <android.support.design.widget.TextInputLayout
        android:id="@+id/text_input_layout_user"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        app:counterOverflowTextAppearance="@style/TextOverCount"
        android:scrollbarAlwaysDrawHorizontalTrack="true"
        android:textColorHint="@color/colorHint"
        >
         <EditText
             android:id="@+id/text_input_user"
             android:layout_width="match_parent"
             android:layout_height="48dp"
             android:hint="用戶名"
             android:inputType="text"
             android:textColor="@color/black"
             />

    </android.support.design.widget.TextInputLayout>
    <android.support.design.widget.TextInputLayout
        android:id="@+id/text_input_layout_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        app:counterOverflowTextAppearance="@style/TextOverCount"
        android:scrollbarAlwaysDrawHorizontalTrack="true"
        android:textColorHint="@color/colorHint"
        >
        <EditText
            android:id="@+id/text_input_phone"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:hint="手機(jī)號(hào)碼"
            android:inputType="number"
            android:textColor="@color/black"
            />

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

效果如下:

Floating_label.gif

2,帶字符計(jì)數(shù)的文本框
布局:

<android.support.design.widget.TextInputLayout
        android:id="@+id/text_input_layout_user"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:textColorHint="@color/colorHint"
        >
         <EditText
             android:id="@+id/text_input_user"
             android:layout_width="match_parent"
             android:layout_height="48dp"
             android:hint="用戶名"
             android:inputType="text"
             android:textColor="@color/black"
             />

    </android.support.design.widget.TextInputLayout>
    <android.support.design.widget.TextInputLayout
        android:id="@+id/text_input_layout_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"

        android:scrollbarAlwaysDrawHorizontalTrack="true"
        android:textColorHint="@color/colorHint"
        >
        <EditText
            android:id="@+id/text_input_phone"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:hint="手機(jī)號(hào)碼"
            android:inputType="number"
            android:textColor="@color/black"
            />
    </android.support.design.widget.TextInputLayout>

在Activity 中設(shè)置,計(jì)數(shù)的長(zhǎng)度:


        mTextInputLayoutUser = (TextInputLayout) findViewById(R.id.text_input_layout_user);
        //設(shè)置可以計(jì)數(shù)
        mTextInputLayoutUser.setCounterEnabled(true);
        //計(jì)數(shù)的最大值
        mTextInputLayoutUser.setCounterMaxLength(20);

效果如下:

count_edittext.gif

如上圖所示,右下角會(huì)自動(dòng)計(jì)數(shù),當(dāng)超過最大值時(shí),計(jì)數(shù)文本、浮動(dòng)標(biāo)簽和下標(biāo)線都變成了紅色,然后我們也可以用上面介紹的屬性來更改:
添加代碼

app:counterOverflowTextAppearance="@style/TextOverCount"

style 的代碼如下:


    <style name="TextOverCount" parent="Base.TextAppearance.AppCompat.Light.Widget.PopupMenu.Small">
      <item name="android:textColor">@android:color/holo_green_light</item>
    </style>

效果如下:

count_over_apprence.png

如上圖,將顯示的顏色改為了綠色,當(dāng)然也可以在style中改字體的大小,在添加一個(gè)item 就行

<item name="android:textSize">20sp</item>  

** 更改計(jì)數(shù)文本的顯示樣式是一樣的,定義一個(gè)style ,然后通過app:counterTextAppearance 設(shè)置就行。**

** 3,顯示密碼可見和隱藏的切換按鈕**
代碼如下:

 <android.support.design.widget.TextInputLayout
        android:id="@+id/text_input_layout_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:textColorHint="@color/colorHint"
        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/colorHint"
        app:passwordToggleDrawable="@drawable/ic_eye_grey_24dp"
        >

        <android.support.design.widget.TextInputEditText
            android:id="@+id/text_input_password"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:hint="密碼"
            android:textColor="@color/black"
            android:inputType="textPassword"
            android:singleLine="true"
            />
    </android.support.design.widget.TextInputLayout>

效果如下:

toggle.gif

如上圖,可以看到,右邊多了一個(gè)圖標(biāo),點(diǎn)擊圖標(biāo)可以使密碼是明文或者隱藏。只是在布局文件中添加了幾個(gè)屬性

        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/colorHint"
        app:passwordToggleDrawable="@drawable/ic_eye_grey_24dp"

當(dāng)然了,也可依在代碼中設(shè)置,一樣的效果,不在演示。
4, 顯示錯(cuò)誤信息
TextInputLayout 是可以顯示錯(cuò)誤信息的,這種需求很常見沒,比如登錄的時(shí)候密碼錯(cuò)誤,給出相應(yīng)的提示,比Toast 提示更加友好。
代碼如下:

        mTextInputLayoutPassword = (TextInputLayout) findViewById(R.id.text_input_layout_password);
        mInputEditTextPassword = (TextInputEditText) findViewById(R.id.text_input_password);

        mInputEditTextPassword.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) {
                mTextInputLayoutPassword.setErrorEnabled(false);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String password = mInputEditTextPassword.getText().toString();
                if(TextUtils.isEmpty(password)||password.length()<6){
                    mTextInputLayoutPassword.setError("密碼錯(cuò)誤不能少于6個(gè)字符");
                }

            }
        });

效果如下:

error_tip.gif

當(dāng)密碼不正確的時(shí)候,顯示錯(cuò)誤提示,當(dāng)內(nèi)容發(fā)生變幻的時(shí)候,記得調(diào)用

mTextInputLayoutPassword.setErrorEnabled(false);

否則錯(cuò)誤信息會(huì)一直顯示界面上。

** 當(dāng)然有些時(shí)候我們不需要浮動(dòng)標(biāo)簽,或者不需要浮動(dòng)標(biāo)簽的動(dòng)畫,我們可以控制,將對(duì)應(yīng)屬性設(shè)置為false就行了。**

TextInputEditText 使用

上面講了TextInputLayout的使用,那么TextInputEditText是干什么的呢? 其實(shí)就是一個(gè)EditText 的子類,上面講的所有功能,TextInputLayout 里面包的子View既可以是EditText,也可以是TextInputEditText,效果是一樣的。根據(jù)文檔的解釋,官網(wǎng)原文:A special sub-class of EditText
designed for use as a child of TextInputLayout。Using this class allows us to display a hint in the IME when in 'extract' mode.

解釋:TextInputEditText 是 EditText 的子類,專門用作TextInputLayout的子View。它允許再`extract`模式(提取模式)下顯示浮動(dòng)標(biāo)簽。

也看過一些文章說,橫屏模式EditText 不顯示浮動(dòng)標(biāo)簽,TextInputEditText 會(huì)顯示浮動(dòng)標(biāo)簽,但是我測(cè)試了一下,并沒有發(fā)現(xiàn)所說的EditText 不顯示浮動(dòng)標(biāo)簽,TextInputEditText 會(huì)顯示浮動(dòng)標(biāo)簽。如果有知道的,請(qǐng)?jiān)谠u(píng)論區(qū)告知一下。,測(cè)試效果如下:(上看兩個(gè)是EditText,最后一個(gè)是TextInputEditText)

text_input_edit.gif

** TextInputEditText 、EditText 作為TextInputLayout 的子View使用差別很小,既然Google 說在extract 模式下TextInputEditText 更好,那我們開發(fā)中使用TextInputEditText配合TextInputLayout使用就好了。**

另外,上面講了TextInputLayout 可以顯示錯(cuò)誤信息,TextInputEditText也是可以顯示錯(cuò)誤信息的,用下面兩個(gè)方法:

mInputEditTextUser.setError("格式不正確");
//或者
mInputEditTextUser.setError("格式不正確",getDrawable(R.drawable.activity_close)); 
error_tip2.png

最后

以上就是TextInputLayout和TextInputEditText 的全部?jī)?nèi)容,Demo 請(qǐng)戳MaterialDesignSamples。元旦之前來一發(fā),祝大家元旦快樂??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容