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
dependencies { compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.0' }
佈局文件:正則表達式
<?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 來作這個事。我這裏用一個維基百科裏的正則表達式。佈局
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
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的顏色。動畫