如果我在XML中添加EditText
,我可以设置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" />
现在我在Java中绘制EditText
。我想要设置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 ?
如何设定?
答案 0 :(得分:53)
没有公共API来设置光标drawable。您可以使用反射以编程方式设置它。字段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) {
}
}
答案 1 :(得分:3)
对光标可绘制对象使用反射是prohibited from Android Q。
相反,有一个新的setTextCursorDrawable API,我们可以使用它。
答案 2 :(得分:1)
答案是---------------------&gt;这是无法实现的。
实际上,我在工作中也遇到了这个问题,但在检查了谷歌的doc和源代码之后,我觉得你不能在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);
}
答案 3 :(得分:0)
如果使用AppCompat library并且您的Activity扩展了AppCompatActivity,则可以使用 colorAccent 的XML样式设置文本光标的颜色(对于所有EditTexts):
<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 color accent is ignored, no padding on dialogs
答案 4 :(得分:0)
您应该使用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
答案 5 :(得分: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);
}
}
}