一、EditText 基礎:不僅僅是輸入框
EditText
是 TextView
的子類,允許用戶輸入和編輯文本。
1. 基本布局
<EditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="請輸入用戶名"android:textColorHint="#999999"android:textColor="#333333"android:textSize="16sp"android:padding="12dp"android:background="@drawable/edittext_bg" />
2. 獲取輸入內容
EditText etUsername = findViewById(R.id.et_username);
String username = etUsername.getText().toString().trim();
?? 注意:始終使用
trim()
去除首尾空格。
二、inputType:精準控制輸入類型
android:inputType
是控制 EditText
輸入內容和軟鍵盤類型的關鍵屬性。
1. 常用 inputType 值
inputType | 說明 | 軟鍵盤 |
---|---|---|
text | 普通文本 | QWERTY |
textEmailAddress | 郵箱地址 | 帶 @ 和 . 的鍵盤 |
textPassword | 密碼(隱藏) | QWERTY,通常帶“顯示密碼”圖標 |
textVisiblePassword | 可見密碼 | QWERTY |
number | 數字 | 數字鍵盤 |
numberPassword | 數字密碼 | 數字鍵盤,隱藏 |
phone | 電話號碼 | 帶數字和 *、# 的鍵盤 |
datetime | 日期時間 | 日期時間鍵盤 |
textMultiLine | 多行文本 | 回車鍵換行 |
textCapSentences | 首字母大寫 | - |
textCapWords | 單詞首字母大寫 | - |
textCapCharacters | 全部大寫 | - |
textNoSuggestions | 禁用拼寫建議 | - |
2. 組合使用
<!-- 郵箱輸入 -->
<EditTextandroid:inputType="textEmailAddress"android:hint="郵箱地址" /><!-- 密碼輸入 -->
<EditTextandroid:inputType="textPassword"android:hint="密碼" /><!-- 手機號碼 -->
<EditTextandroid:inputType="phone"android:hint="手機號" /><!-- 多行評論 -->
<EditTextandroid:inputType="textMultiLine|textCapSentences"android:lines="3"android:gravity="top|start"android:hint="請輸入評論..." />
? 最佳實踐:始終為
EditText
設置合適的inputType
,提升輸入效率和準確性。
三、軟鍵盤(IME)控制
1. 控制軟鍵盤行為
<!-- 回車鍵功能 -->
<EditTextandroid:imeOptions="actionDone"android:inputType="text"android:nextFocusDown="@+id/et_password" /><!-- 可選值: actionGo, actionSearch, actionSend, actionNext, actionDone -->
2. 監聽回車鍵
etUsername.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == EditorInfo.IME_ACTION_DONE) {// 處理“完成”按鈕點擊hideKeyboard(v);performLogin();return true;}return false;}
});
3. 顯示/隱藏軟鍵盤
// 顯示軟鍵盤
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(etUsername, InputMethodManager.SHOW_IMPLICIT);// 隱藏軟鍵盤
imm.hideSoftInputFromWindow(etUsername.getWindowToken(), 0);
四、輸入過濾與格式化
1. 限制輸入長度
<EditTextandroid:maxLength="11"android:hint="手機號(11位)" />
2. 自定義輸入過濾器
// 只允許輸入數字和字母
InputFilter filter = new InputFilter() {@Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {String blockChars = "!@#$%^&*()_+-=[]{}|;':\",./<>?";for (int i = start; i < end; i++) {if (blockChars.indexOf(source.charAt(i)) != -1) {return ""; // 過濾掉}}return null; // 允許輸入}
};
etUsername.setFilters(new InputFilter[]{filter});
3. 實時格式化(如手機號 3-4-4)
etPhone.addTextChangedListener(new TextWatcher() {private String previous = "";@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {previous = s.toString();}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {String digits = s.toString().replaceAll("\\D", ""); // 只保留數字if (digits.length() > 11) {digits = digits.substring(0, 11);}// 格式化為 3-4-4String formatted = formatPhoneNumber(digits);if (!formatted.equals(s.toString())) {s.replace(0, s.length(), formatted);}}private String formatPhoneNumber(String digits) {if (digits.length() <= 3) return digits;else if (digits.length() <= 7) return digits.substring(0, 3) + "-" + digits.substring(3);else return digits.substring(0, 3) + "-" + digits.substring(3, 7) + "-" + digits.substring(7);}
});
五、安全性與隱私
1. 密碼輸入安全
- 使用?
textPassword
?或?textWebPassword
。 - 避免在日志中打印密碼。
- 考慮實現“顯示/隱藏密碼”功能:
<com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:passwordToggleEnabled="true"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPassword"android:hint="密碼" /></com.google.android.material.textfield.TextInputLayout>
2. 防止敏感信息保存
<!-- 禁止輸入歷史和拼寫檢查 -->
<EditTextandroid:inputType="textNoSuggestions|textVisiblePassword"android:importantForAutofill="no" />
六、Material Design 最佳實踐
推薦使用 Material Design
的 TextInputLayout
+ TextInputEditText
組合,提供更專業的表單體驗。
1. 添加依賴
implementation 'com.google.android.material:material:1.11.0'
2. 使用 TextInputLayout
<com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用戶名"app:errorEnabled="true"app:counterEnabled="true"app:counterMaxLength="20"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="text"android:maxLines="1" /></com.google.android.material.textfield.TextInputLayout>
3. 動態顯示錯誤信息
TextInputLayout tilUsername = findViewById(R.id.til_username);
TextInputEditText etUsername = tilUsername.getEditText();// 驗證輸入
if (username.isEmpty()) {tilUsername.setError("用戶名不能為空");
} else {tilUsername.setError(null); // 清除錯誤
}
? 優勢:
- 浮動標簽(Floating Label)
- 內置錯誤提示
- 字數統計
- 更好的無障礙支持
七、用戶體驗優化
- 自動聚焦:頁面打開時自動聚焦到第一個輸入框。
- 回車跳轉:使用?
nextFocusDown
?實現輸入框間的跳轉。 - 清除按鈕:長按或聚焦時顯示清除圖標。
- 輸入提示:使用?
AutoCompleteTextView
?提供搜索建議。 - 防抖提交:避免用戶快速點擊提交按鈕。
八、總結:文本輸入設計 checklist
項目 | 是否完成 |
---|---|
? 設置合適的?inputType | ? |
? 提供清晰的?hint | ? |
? 限制輸入長度 (maxLength ) | ? |
? 使用?TextInputLayout ?(推薦) | ? |
? 實現輸入驗證與錯誤提示 | ? |
? 控制軟鍵盤行為 (imeOptions ) | ? |
? 處理焦點切換 | ? |
? 考慮安全性(密碼、隱私) | ? |
? 優化用戶體驗(格式化、自動填充) | ? |
九、結語
感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!