首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 程式碼動態設定 EditText 唯讀/可編輯狀態:InputFilter 方案

     編輯:程式設計綜合問答

EditText 無 setEditable() 方法(API 3 棄用),動態控制可編輯狀態有三種主流方案:InputFilter 阻擋輸入、setFocusable(false) 移除焦點、setEnabled(false) 完全停用。視 UX 需求選擇。

方案一:InputFilter 阻擋所有輸入(保持外觀、可複製、可捲動)


// 設為唯讀
editText.setFilters(new InputFilter[] { new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        // 允許刪除、剪貼等非輸入操作
        if (end <= start) return null; // 刪除鍵
        return ""; // 阻擋所有字元輸入
    }
}});

// 恢復可編輯
editText.setFilters(new InputFilter[0]); // 空陣列 = 無過濾

方案二:setFocusable / setFocusableInTouchMode(標準表單唯讀)


// 唯讀:可複製、可捲動、不可編輯、無游標、鍵盤不彈出
editText.setFocusable(false);
editText.setFocusableInTouchMode(false);
editText.setClickable(false); // 可選
editText.setLongClickable(false); // 可選

// 可編輯
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setClickable(true);
editText.setLongClickable(true);

方案三:setEnabled(完全停用,灰色外觀)


// 停用
editText.setEnabled(false); // 灰色、不可互動、不可複製

// 啟用
editText.setEnabled(true);

方案比較與選擇指南

需求推薦方案外觀可複製鍵盤游標
表單唯讀欄位(需複製)setFocusable(false)正常✅❌❌
條件式鎖定(保持外觀)InputFilter正常✅✅✅
完全停用(視覺區隔)setEnabled(false)灰色❌❌❌
密碼欄位切換顯示/隱藏setInputType + setSelection正常❌✅✅

進階:條件式 InputFilter(僅允許數字、限制長度等)


// 只允許數字,最長 11 位
editText.setFilters(new InputFilter[] {
    new InputFilter.LengthFilter(11),
    (source, start, end, dest, dstart, dend) -> {
        for (int i = start; i < end; i++) {
            if (!Character.isDigit(source.charAt(i))) return "";
        }
        return null; // 允許
    }
});

XML 靜態設定對照

XML 屬性程式碼等效效果
android:editable="false"已棄用舊版唯讀
android:focusable="false"setFocusable(false)移除焦點
android:enabled="false"setEnabled(false)完全停用
android:inputType="none"setInputType(TYPE_NULL)隱藏鍵盤

最佳實踐建議

  • 表單欄位唯讀:setFocusable(false) + setFocusableInTouchMode(false)
  • 臨時鎖定(如驗證碼倒數):InputFilter 方案,解鎖只需 setFilters(new InputFilter[0])
  • 視覺上區分「可編輯/不可編輯」:搭配背景色、游標色變更
  • 無障礙支援:setImportantForAccessibility 確保 TalkBack 正確讀取

根據互動需求選擇適當方案,InputFilter 適合「保持外觀但阻擋輸入」,setFocusable 適合標準表單唯讀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved