三三想成為安卓糕手
一:用戶登錄校驗
1:EditText文本輸入框
<EditTextandroid:id="@+id/et_user_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="number"android:maxLines="16"android:hint="請輸入用戶名" /><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPassword"android:maxLength="16"android:hint="請輸入密碼" />
2:hint提示信息
android:hint="請輸入用戶名" />
hint 提示線索
3:inputType輸入類型
兄弟太吊了 android:inputType="number"
設置用戶名的輸入類型為number,那么調用出來的鍵盤如下左圖所示(為數字鍵盤),輸入框不接收輸入非數字的內容
設置密碼的輸入類型為textPassword,那么該屏幕界面會被隱藏,并且做了一個加密的處理,還有不能被截圖,默認輸入法是數字帶字母
輸入框還可以接收很多種類型
文本,郵件地址,電話,日期時間等等
4:maxLines位數限制
android:maxLength="16"
這玩意好像對用戶名位數限制不咋管用啊;對密碼到是管用的很
5:用戶名和密碼校驗
實現效果
左圖:用戶名和密碼正確但是沒有勾選協議,點擊登錄
右圖:用戶名正確,密碼錯誤,點擊登錄
這里的情況還有好幾種,上述代碼基本都能夠攔截到
//成員變量private EditText etUserName;private EditText etPassword;
initEditText();
//這個方法的調用應該在登錄監聽器觸發之前,主要作用就是完成初始化,避免空指針異常
private void initEditText(){etUserName = findViewById(R.id.et_user_name);etPassword = findViewById(R.id.et_password);}
/*** 監聽登錄按鈕的狀態**/Button loginButton = findViewById(R.id.btn_login);loginButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {boolean checked = cbArgreement.isChecked();if(!checked){Toast.makeText(CheckBoxActivity.this, "請勾選協議", Toast.LENGTH_SHORT).show();}String userName = etUserName.getText().toString().trim();String passWord = etPassword.getText().toString().trim();//點擊登錄按鈕,檢測用戶名和密碼都正確并且勾選了協議,此時才會進行頁面跳轉。if(userName.equals("admin") && passWord.equals(123456)){//這句代碼是在是太ex了兄弟,我完全是蒙蒙的狀態啊xd,窩里哇瓦力哇一袋米扛幾樓//判斷勾選了協議,點擊登錄按鈕,進行頁面跳轉startActivity(new Intent(CheckBoxActivity.this,SecondActivity.class));}else{//準備彈窗提示Toast.makeText(CheckBoxActivity.this, "用戶名與密碼不匹配", Toast.LENGTH_SHORT).show();}}});
.trim()方法屬于String類中的,可以去除字符串兩端的空白字符(包括空格,制表符,換行符等)
二:文本變化監聽
0:監聽器的生命周期
這里是一個非常大誤區,這個監聽器的銷毀并不會隨著方法的結束而結束。
一旦監聽器注冊完成,它就會一直保持活躍狀態,直到滿足以下條件之一:
- EditText 控件被銷毀:在 Activity 的
onDestroy()
方法執行之后。 - 手動移除監聽器:調用
etUserName.removeTextChangedListener(...)
方法。
1:代碼
這里主要對用戶名設置文本監聽
private void initEditText(){etUserName = findViewById(R.id.et_user_name);etPassword = findViewById(R.id.et_password);etUserName.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {Log.e(TAG,"CharSequence s" + s + "," + " int start" + start +"," + " int count" + count + "," + "int after" + after);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {Log.e(TAG,"CharSequence s" + s + "," + " int start" + start +"," + " int count" + count + "," + "int after" + count);}@Overridepublic void afterTextChanged(Editable s) {Log.e(TAG,"afterTextChanged:" + s.toString());}});}
我們設置一個類TAG成員變量方便查看日志(快捷方式logt)
private static final String TAG = "CheckBoxActivity";//自己設置TAG名稱
2:結果和日志分析
我們在用戶名輸入框中輸入admin
查看日志
刪掉下標為2的字符m
查看日志
注:以下方法的分析只針對刪除“admin”中字符‘m’的操作
3:beforeTextChanged
文本發生變化前被調用,有四個參數
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {Log.e(TAG,"CharSequence s" + s + "," + " int start" + start +"," + " int count" + count + "," + "int after" + after);}
CharSequence s
代表文本變化前(初始內容)
EditText 里原本的文字內容為“admin”,那s = admin
int start
表示文本中即將發生變化的起始位置索引
刪除了“m”,索引位置為 2,start 就是 2 (這里替換操作同理)
int count
指從 start
位置開始, “要被‘干掉’的舊字符數量”
m被干掉了,所以count = 1
提問:如果新字符和舊字符相同呢?
只要文本框的內容==經歷了 “替換” 過程(無論替換前后內容是否一致),方法都會被觸發,內部邏輯正常計算,==
int after
代表文本變化后,從 start
位置開始新增的字符數量 。
沒有新增內容 after = 0
4:onTextChanged
文本變化時觸發(如用戶輸入過程中)
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {Log.e(TAG,"CharSequence s" + s + "," + " int start" + start +"," + " int count" + count + "," + "int after" + count);}
前兩個參數與beforeTextChanged參數相同
CharSequence s
代表文本變化時(初始內容)
EditText 里原本的文字內容為“adin”,那s = adin
int start
表示文本中即將發生變化的起始位置索引
刪除了“m”,索引位置為 2,start 就是 2 (這里替換操作同理)
int before
原文本被替換的長度,其實就是beforeTextChanged中的count(被干掉的數量)
這里是刪除操作,也就是m被替換成了空,所以bfore = 1
int count
代表變化后,從 start
位置新增的字符數量。
延續上面例子,若刪掉 “m”,沒有新增操作,那count = 0
5:afterTextChanged方法
文本變化后的最終完整內容
@Override
public void afterTextChanged(Editable s) {Log.e(TAG,"afterTextChanged:" + s.toString());
}
6:總結
方法 | 觸發時機 | 參數含義 |
---|---|---|
beforeTextChanged | 文本變化前觸發(如用戶輸入前)。 | - s :變化前的文本。- start :變化開始的位置。- count :即將被替換的原文本長度。- after :新文本的長度。 |
onTextChanged | 文本變化時觸發(如用戶輸入過程中)。 | - s :變化后的文本。- start :變化開始的位置。- before :原文本被替換的長度(即 beforeTextChanged 中的 count )。- count :新插入的文本長度(即 beforeTextChanged 中的 after )。 |
afterTextChanged | 文本變化后 | -Editable s 這里的 s 代表 文本變化后的最終完整內容 。類型可以轉化為字符串類型 |
應用場景:哇嘎嘎嘎,實時獲取輸入的內容進行搜索