set textCursorDrawable programmatically(以编程方式设置 textCursorDrawable)
问题描述
如果我在 XML 中添加 EditText
我可以设置 textCursorDrawable="@null"
:
现在我用 Java 绘制一个 EditText
.我想设置 android:textCursorDrawable="@null"
.
LinearLayout.LayoutParams paramtext = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,线性布局.LayoutParams.WRAP_CONTENT);EditText txtOther = new EditText(this);txtOther.setLayoutParams(paramtext);txtOther.setBackgroundColor(Color.WHITE);txtOther.setTextColor(Color.BLACK);txtOther.setId(99999);//txtOther.setCursorDrawable ?
如何设置?
2019 年更新:没有设置可绘制光标的公共 API. 参见 https://stackoverflow.com/a/57555148/253468 适用于 29 及更高版本的 API,在此之前,您需要有条件地使用反射,如下所述.p>
在 API 29 之前,您可以使用反射以编程方式设置它.mCursorDrawableRes
字段没有更改,因此这应该适用于所有设备,除非制造商更改了某些内容或稍后更改.
使用反射设置光标:
EditText yourEditText = new EditText(context);...尝试 {//https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564字段 f = TextView.class.getDeclaredField(mCursorDrawableRes");f.setAccessible(true);f.set(yourEditText, R.drawable.cursor);} 捕捉(忽略异常){}
在你的应用中定义一个可绘制的光标:
另一种方法:
您也可以通过以下方法设置光标颜色:
public static void setCursorDrawableColor(EditText editText, int color) {尝试 {字段 fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");fCursorDrawableRes.setAccessible(true);int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);字段 fEditor = TextView.class.getDeclaredField("mEditor");fEditor.setAccessible(true);对象编辑器 = fEditor.get(editText);类<?>clazz = editor.getClass();字段 fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");fCursorDrawable.setAccessible(true);可绘制 [] 可绘制 = 新的可绘制 [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(编辑器,drawables);} catch (Throwable 被忽略) {}}
If I add an EditText
in XML I can set 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" />
Now I draw an EditText
in Java. I want set 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 ?
How do set it?
Update 2019: There is no public API to set the cursor drawable. See https://stackoverflow.com/a/57555148/253468 for API available on 29 and above, before that conditionally you'll need to use reflection as described below.
Before API 29 you can set it programmatically by using reflection. The field mCursorDrawableRes
hasn't changed so this should work on all devices, unless a manufacturer changed something or it is later changed.
Use reflection to set the cursor:
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) {
}
Define a cursor drawable in your app:
<?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>
Another approach:
You can also set the cursor color with the following method:
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) {
}
}
这篇关于以编程方式设置 textCursorDrawable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:以编程方式设置 textCursorDrawable
基础教程推荐
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01