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

Android EditText 清空內容後光標消失問題解決全攻略

     編輯:程式設計綜合問答

問題現象

EditText 初始 enabled="false",程式碼動態啟用並請求焦點、彈出鍵盤。輸入文字後全選刪除,光標隨即消失,無法繼續輸入。

根本原因分析

  1. android:inputType="none" 導致編輯器不顯示光標(無輸入法連接)。
  2. 動態 setInputType(TYPE_CLASS_TEXT) 雖改變輸入類型,但若 View 已附著於視窗,可能需 setText() 觸發重繪。
  3. Android 3.2+ 光標顏色由 android:textCursorDrawable 控制,預設可能與背景同色(白底白光標)。

解決方案(按優先級)

方案一:XML 靜態配置(推薦)

<EditText
    android:id="@+id/edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:inputType="text"          <!-- 移除 "none" -->
    android:text="@string/nicheng2"
    android:textColor="@color/gray5"
    android:textSize="@dimen/textSize_1"
    android:enabled="false"
    android:textCursorDrawable="@null" />  <!-- 光標跟隨文字顏色 -->

程式碼中僅需 edit.setEnabled(true),光標自動顯示。

方案二:程式碼動態修復

edit.setEnabled(true);
edit.setInputType(InputType.TYPE_CLASS_TEXT);
// 強制刷新光標可見性
edit.setText(edit.getText()); // 觸發內部 Editor 重建
edit.setSelection(edit.length());
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.showSoftInput(edit, InputMethodManager.SHOW_IMPLICIT);

方案三:主題/樣式層面統一

在 styles.xml 定義:

<style name="Widget.EditText.Cursor" parent="Widget.AppCompat.EditText">
    <item name="android:textCursorDrawable">@null</item>
    <item name="colorControlActivated">@color/your_accent_color</item>
</style>

佈局引用 style="@style/Widget.EditText.Cursor"。

版本相容性說明

  • API 18 (4.3) 以上:textCursorDrawable="@null" 完美生效。
  • API 17 及以下:無此屬性,需透過反射修改 TextView.mCursorDrawableRes 欄位,或降低 targetSdkVersion 至 10(不推薦,影響其他控件樣式)。

最佳實踐總結

  1. XML 中直接設定 inputType="text" 而非 "none"。
  2. 加上 android:textCursorDrawable="@null" 確保光標顏色跟隨文字。
  3. 動態啟用時呼叫 setText(getText()) 刷新編輯器狀態。
  4. 避免在 OnFocusChangeListener 中複雜操作導致焦點震盪。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved