Material Design之TextInputLayout使用示例

Google在2015的IO大會上,給咱們帶來了更加詳細的Material Design設計規範,同時,也給咱們帶來了全新的Android Design Support Library,在這個support庫裏面,Google給咱們提供了更加規範的MD設計風格的控件。最重要的是,Android Design Support Library的兼容性更廣,直接能夠向下兼容到Android 2.2。這不得不說是一個良心之做。html

效果圖:java

在項目的build.gradle文件中,添加下面的依賴(dependencies),並同步工程。android

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. dependencies {  
  2.     compile 'com.android.support:appcompat-v7:23.1.1'  
  3.     compile 'com.android.support:design:23.1.0'  
  4. }  
dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.0'
}

佈局文件:正則表達式

 

[html] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
    2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.              android:layout_width="match_parent"  
    4.              android:layout_height="match_parent"  
    5.              android:orientation="vertical">  
    6.  
    7.    <android.support.design.widget.TextInputLayout  
    8.        android:layout_width="match_parent"  
    9.        android:layout_height="wrap_content"  
    10.        android:id="@+id/usernameWrapper"  
    11.        android:layout_marginTop="32dp"  
    12.        android:focusable="true"  
    13.        android:focusableInTouchMode="true">  
    14.        <EditText  
    15.            android:layout_width="match_parent"  
    16.            android:layout_height="wrap_content"  
    17.            android:inputType="textEmailAddress"  
    18.            android:hint="請輸入帳號"  
    19.            android:ems="10"  
    20.            android:id="@+id/username" />  
    21.    </android.support.design.widget.TextInputLayout>  
    22.  
    23.  
    24.    <android.support.design.widget.TextInputLayout  
    25.        android:layout_width="match_parent"  
    26.        android:layout_height="wrap_content"  
    27.        android:id="@+id/passwordWrapper">  
    28.        <EditText  
    29.            android:inputType="textPassword"  
    30.            android:id="@+id/password"  
    31.            android:hint="請輸入密碼"  
    32.            android:layout_width="match_parent"  
    33.            android:layout_height="wrap_content"/>  
    34.    </android.support.design.widget.TextInputLayout>  
    35.  
    36.    <Button  
    37.        android:onClick="login"  
    38.        android:layout_marginTop="16dp"  
    39.        android:layout_width="match_parent"  
    40.        android:layout_height="wrap_content"  
    41.        android:layout_gravity="right"  
    42.        android:text="登陸"  
    43.        android:id="@+id/login"  
    44.        android:textColor="#009999"/>  
    45.</LinearLayout>  

     

若是佈局這樣設置了,運行起來沒有動畫效果的話,那麼須要在Activity中初始化了,我是沒有遇到過這個問題。app

 

 

TextInputLayout另外一個很讚的功能是,能夠處理錯誤狀況。經過驗證用戶輸入,你能夠防止用戶輸入錯誤的郵箱,或者輸入不符合規則的密碼。 
有些輸入驗證,驗證是在後臺作得,產生錯誤後會反饋給前臺,最後展現給用戶。很是耗時並且用戶體驗差。最好的辦法是在請求後臺前作校驗。ide


假設是驗證郵箱帳號,驗證郵箱稍微有些複雜,咱們能夠用Apache Commons library 來作這個事。我這裏用一個維基百科裏的正則表達式。佈局

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1. private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";  
  2. private Pattern pattern = Pattern.compile(EMAIL_PATTERN);  
  3. private Matcher matcher;  
  4.   
  5. //判斷帳號的格式,這裏是郵箱的格式  
  6. public boolean validateEmail(String email) {  
  7.     matcher = pattern.matcher(email);  
  8.     return matcher.matches();  
  9. }  
1  private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";
2     private Pattern pattern = Pattern.compile(EMAIL_PATTERN);
3     private Matcher matcher;
4 
5     //判斷帳號的格式,這裏是郵箱的格式
6     public boolean validateEmail(String email) {
7         matcher = pattern.matcher(email);
8         return matcher.matches();
9     }

 


所有代碼:gradle

 

[java] view plain copy
 
print?在CODE上查看代碼片派生到個人代碼片
  1 package com.zhangli.mylayout;  
  2 2.  
  3 3.import android.content.Context;  
  4 4.import android.os.Bundle;  
  5 5.import android.support.design.widget.TextInputLayout;  
  6 6.import android.support.v7.app.AppCompatActivity;  
  7 7.import android.view.View;  
  8 8.import android.view.inputmethod.InputMethodManager;  
  9 9.import android.widget.Toast;  
 10 10.  
 11 11.import java.util.regex.Matcher;  
 12 12.import java.util.regex.Pattern;  
 13 13.  
 14 14.public class MainActivity extends AppCompatActivity  {  
 15 15.  
 16 16.    private TextInputLayout usernameWrapper;  
 17 17.    private TextInputLayout passwordWrapper;  
 18 18.  
 19 19.    @Override  
 20 20.    protected void onCreate(Bundle savedInstanceState) {  
 21 21.        super.onCreate(savedInstanceState);  
 22 22.        setContentView(R.layout.activity_main);  
 23 23.  
 24 24.        usernameWrapper= (TextInputLayout) findViewById(R.id.usernameWrapper);  
 25 25.        passwordWrapper= (TextInputLayout) findViewById(R.id.passwordWrapper);  
 26 26.  
 27 27.    }  
 28 28.  
 29 29.    public void login(View v){  
 30 30.        hideKeyboard();  
 31 31.        String username = usernameWrapper.getEditText().getText().toString();  
 32 32.        String password = passwordWrapper.getEditText().getText().toString();  
 33 33.  
 34 34.        if (!validateEmail(username)) {  
 35 35.            usernameWrapper.setError("帳號格式不正確");  
 36 36.        }else if (!validatePassword(password)) {  
 37 37.            passwordWrapper.setError("密碼不能小於6位數");  
 38 38.        }else{  
 39 39.            doLogin();  
 40 40.        }  
 41 41.    }  
 42 42.  
 43 43.    //讓鍵盤彈回去  
 44 44.    private void hideKeyboard() {  
 45 45.        View view = getCurrentFocus();  
 46 46.        if (view != null) {  
 47 47.            ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).  
 48 48.                    hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
 49 49.        }  
 50 50.    }  
 51 51.  
 52 52.    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";  
 53 53.    private Pattern pattern = Pattern.compile(EMAIL_PATTERN);  
 54 54.    private Matcher matcher;  
 55 55.  
 56 56.    //判斷帳號的格式,這裏是郵箱的格式  
 57 57.    public boolean validateEmail(String email) {  
 58 58.        matcher = pattern.matcher(email);  
 59 59.        return matcher.matches();  
 60 60.    }  
 61 61.  
 62 62.    //密碼長度要大於5  
 63 63.    public boolean validatePassword(String password) {  
 64 64.        return password.getBytes().length>5;  
 65 65.    }  
 66 66.  
 67 67.    public void doLogin() {  
 68 68.        Toast.makeText(getApplicationContext(), "登錄成功", Toast.LENGTH_SHORT).show();  
 69 69.    }  
 70 70.}  
 71 package com.zhangli.mylayout;
 72 
 73 import android.content.Context;
 74 import android.os.Bundle;
 75 import android.support.design.widget.TextInputLayout;
 76 import android.support.v7.app.AppCompatActivity;
 77 import android.view.View;
 78 import android.view.inputmethod.InputMethodManager;
 79 import android.widget.Toast;
 80 
 81 import java.util.regex.Matcher;
 82 import java.util.regex.Pattern;
 83 
 84 public class MainActivity extends AppCompatActivity  {
 85 
 86     private TextInputLayout usernameWrapper;
 87     private TextInputLayout passwordWrapper;
 88 
 89     @Override
 90     protected void onCreate(Bundle savedInstanceState) {
 91         super.onCreate(savedInstanceState);
 92         setContentView(R.layout.activity_main);
 93 
 94         usernameWrapper= (TextInputLayout) findViewById(R.id.usernameWrapper);
 95         passwordWrapper= (TextInputLayout) findViewById(R.id.passwordWrapper);
 96 
 97     }
 98 
 99     public void login(View v){
100         hideKeyboard();
101         String username = usernameWrapper.getEditText().getText().toString();
102         String password = passwordWrapper.getEditText().getText().toString();
103 
104         if (!validateEmail(username)) {
105             usernameWrapper.setError("帳號格式不正確");
106         }else if (!validatePassword(password)) {
107             passwordWrapper.setError("密碼不能小於6位數");
108         }else{
109             doLogin();
110         }
111     }
112 
113     //讓鍵盤彈回去
114     private void hideKeyboard() {
115         View view = getCurrentFocus();
116         if (view != null) {
117             ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).
118                     hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
119         }
120     }
121 
122     private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";
123     private Pattern pattern = Pattern.compile(EMAIL_PATTERN);
124     private Matcher matcher;
125 
126     //判斷帳號的格式,這裏是郵箱的格式
127     public boolean validateEmail(String email) {
128         matcher = pattern.matcher(email);
129         return matcher.matches();
130     }
131 
132     //密碼長度要大於5
133     public boolean validatePassword(String password) {
134         return password.getBytes().length>5;
135     }
136 
137     public void doLogin() {
138         Toast.makeText(getApplicationContext(), "登錄成功", Toast.LENGTH_SHORT).show();
139     }
140 }

 


提示錯誤的方式仍是很nice的,就是還沒解決將錯誤提示清除的方法,傳進null也不行,會報錯,還請大神解答。hint的color在editText裏設置不了,這裏只用經過設置activity的style中的textColorHint來更改hint的顏色。動畫

相關文章
相關標籤/搜索