43

EditTextXMLで追加すると、次のように設定できtextCursorDrawable="@null"ます。

<EditText
    android:id="@+id/txtE3Casecode4"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="#C7C7C5"
    android:textCursorDrawable="@null"
    android:ems="10"
    android:inputType="number"
    android:maxLength="2"
    android:text="01"
    android:textColor="#000000" />

今、私EditTextはJavaで描画します。セットしたいandroid:textCursorDrawable="@null"

LinearLayout.LayoutParams paramtext = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
EditText txtOther = new EditText(this);
txtOther.setLayoutParams(paramtext);
txtOther.setBackgroundColor(Color.WHITE);
txtOther.setTextColor(Color.BLACK);
txtOther.setId(99999);
// txtOther.setCursorDrawable ?                                

どのように設定しますか?

4

6 に答える 6

70

2019 年更新:カーソル ドローアブルを設定するパブリック API はありません。29 以降で利用可能な API については、 https://stackoverflow.com/a/57555148/253468を参照してください。その前に、以下で説明するように、条件付きでリフレクションを使用する必要があります。

API 29 より前では、リフレクションを使用してプログラムで設定できます。フィールドmCursorDrawableResは変更されていないため、メーカーが何かを変更したり、後で変更されたりしない限り、これはすべてのデバイスで機能するはずです。

リフレクションを使用してカーソルを設定します。

EditText yourEditText = new EditText(context);

...

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

アプリでカーソル ドローアブルを定義します。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    
    <solid android:color="#ff000000" />
    
    <size android:width="1dp" />
    
</shape>

別のアプローチ:

次の方法でカーソルの色を設定することもできます。

public static void setCursorDrawableColor(EditText editText, int color) {
    try { 
        Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
        fCursorDrawableRes.setAccessible(true);
        int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
        Field fEditor = TextView.class.getDeclaredField("mEditor");
        fEditor.setAccessible(true);
        Object editor = fEditor.get(editText);
        Class<?> clazz = editor.getClass();
        Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
        fCursorDrawable.setAccessible(true);
        Drawable[] drawables = new Drawable[2];
        drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        fCursorDrawable.set(editor, drawables);
    } catch (Throwable ignored) {
    } 
} 
于 2014-10-24T08:33:22.923 に答える
1

答えは ----------------------> 達成不可能です。

実際、私も仕事でこの問題に遭遇しましたが、Google のドキュメントとソース コードを確認したところ、Java コードでこの属性を設定できないことが気に入りました。

クラスではTextView、以下のコードを見つけることができます

case com.android.internal.R.styleable.TextView_textCursorDrawable:
    mCursorDrawableRes = a.getResourceId(attr, 0);
    break;

ただし、このメソッドtextCursorDrawable()は にのみ存在しR.attrます。この属性を設定する場合は、XML ファイルに editText を含めることによってのみ、以下の構成メソッドを呼び出すことができます。

public EditText(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.editTextStyle);
}
于 2012-09-18T08:15:40.323 に答える
0

これは私のために働きます

 public void setCursorDrawable(@DrawableRes int resId) {
        if (mEditText == null)
            return;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            mEditText.setTextCursorDrawable(resId);
            return;
        }
        try {
            @SuppressLint("SoonBlockedPrivateApi") Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
            field.setAccessible(true);
            field.set(mEditText, resId);
        } catch (Throwable throwable) {
            Logger.e(TAG, throwable);
        }
    }
}
于 2021-08-12T03:45:19.893 に答える