登錄頁包含用戶名、密碼兩個 EditText。用戶名框右側顯示刪除圖標(drawableEnd),點擊時同時清空兩框內容。
<EditText
android:id="@+id/et_username"
android:drawableEnd="@drawable/ic_clear"
android:drawablePadding="8dp"
... />
<EditText
android:id="@+id/et_password"
android:inputType="textPassword"
... />
EditText etUsername = findViewById(R.id.et_username);
EditText etPassword = findViewById(R.id.et_password);
etUsername.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_UP) {
// 判斷點擊區域是否在 drawableEnd 範圍內
int right = etUsername.getRight();
int left = right - etUsername.getCompoundDrawables()[2].getBounds().width() - etUsername.getDrawablePadding();
if (event.getRawX() >= left && event.getRawX() <= right) {
etUsername.setText("");
etPassword.setText(""); // 核心:同步清空密碼框
return true; // 消費事件
}
}
return false;
});
提取通用邏輯至自定義 View,暴露 OnClearListener 接口,實現「一處編寫、多處復用」:
public class ClearableEditText extends AppCompatEditText {
public interface OnClearListener { void onClear(); }
private OnClearListener listener;
// ... 同樣的觸摸判斷邏輯,觸發 listener.onClear()
}
使用時:
etUsername.setOnClearListener(() -> etPassword.setText(""));
etUsername.requestFocus())體驗更佳。TextInputLayout,可直接調用 setEndIconMode(END_ICON_CLEAR_TEXT)(Material Components 1.2+),無需自寫觸摸邏輯。