43

如果我EditText在 XML 中添加一个,我可以设置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 回答
9

Android Q 禁止对可绘制的光标使用反射。

相反,有一个新的setTextCursorDrawable API ,我们可以使用它。

于 2019-08-19T10:43:00.840 回答
1

答案是------------> 这是无法实现的。

其实我在工作中也遇到过这个问题,但是查了google的doc和source code之后,我喜欢你不能在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

如果您使用AppCompat 库并且您的 Activity 扩展了 AppCompatActivity,您可以使用colorAccent的 XML 样式设置文本光标的颜色(对于所有 EditText):

<style name="AppTheme" parent="@style/Theme.AppCompat">
    <item name="colorAccent">#FF4081</item>
</style>

这适用于 Android 5+,并且向后兼容从 Android 4.4 (API 19) 到 Android 4.0 (API 14) 的旧 Android 版本。注意:如果您使用的是 AutoCompleteTextView,请确保它的任何自定义子类都扩展了 AppCompatAutoCompleteTextView,否则文本光标样式将不起作用。

另请参阅本指南,了解如何将颜色强调(色调)应用于对话框按钮:Android v21 Theme.Appcompat 颜色强调被忽略,对话框上没有填充

于 2017-09-09T20:36:31.037 回答
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 回答
-1

你应该TextInputLayout在 2020 年使用你,它适用于所有设备

<com.google.android.material.textfield.TextInputLayout
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="26dp"
        android:layout_marginEnd="30dp"
        android:theme="@style/TextInputLayoutAppearance"
        app:endIconMode="clear_text"
        app:hintEnabled="false">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/gallery_search"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/inter_medium"
            android:hint="Hint here"
            android:inputType="text"
            android:cursorVisible="true"
            android:focusable="true"
            />

    </com.google.android.material.textfield.TextInputLayout>

这是主要的不要忘记添加这个,您可以从这里更改光标的颜色

<style name="TextInputLayoutAppearance" parent="Widget.Design.TextInputLayout">
        <item name="colorControlNormal">@color/black</item>
        <item name="colorControlActivated">@color/black</item>
        <item name="colorControlHighlight">@color/blue</item>
    </style>

有关 TextInputLayout 的更多信息,请访问此处:- https://material.io/develop/android/components/text-fields

于 2020-11-30T04:50:40.427 回答