我一直在使用反射方法以编程方式设置我的EditText
的光标颜色,这是我从这个答案中找到的(我也尝试了这个答案)。然而,在最近的一些更新之后,我不记得确切的时间了,这种方法不再有效,我假设Android可能已经改变了TextView
类中的某些内容。不管怎样,有人能帮我吗?现在是否有新的字段名用于mCursorDrawable
和mCursorDrawable
,或者整个方法无效,需要现在以另一种方式实现?
更新:我刚刚发现这个方法只在AndroidP上停止工作,在以前的版本上,它仍然有效。
更新2:我自己解决了问题,如果你也卡住了,请检查答案。
不幸的是,即使在兼容库中,Google也没有将xml属性公开给tint,或者为这些属性设置drawables的方法,所以目前动态设置它们的唯一方法是通过如上所述的反射。
但是,您可以在xml中设置可绘制内容,如果您只想为现有的材质设计可绘制内容着色,可以通过为文本选择句柄的xml着色来实现,因为它们是位图可绘制内容,但是光标可绘制内容是一个插入可绘制内容,因此必须从源代码中重新创建。
所使用的可抽出物包括:
R.drawable.abc_text_select_handle_left_mtrl_light
R.drawable.abc_text_select_handle_middle_mtrl_light
R.drawable.abc_text_select_handle_right_mtrl_light
R.drawable.abc_text_cursor_material
您可以创建文本的着色版本,如下所示:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/abc_text_select_handle_left_mtrl_light"
android:tint="@color/my_text_select_handle_color" />
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/abc_text_select_handle_middle_mtrl_light"
android:tint="@color/my_text_select_handle_color" />
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/abc_text_select_handle_right_mtrl_light"
android:tint="@color/my_text_select_handle_color" />
可以从源代码中重新创建光标可绘制,如下所示:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="2dp">
<shape
android:tint="@color/my_text_cursor_color"
android:shape="rectangle">
<size
android:height="2dp"
android:width="2dp" />
<solid
android:color="@color/white" />
</shape>
</inset>
将它们放在drawables文件夹中,并在AppCompatiEditText xml定义中引用它们,使用:
android:textCursorDrawable
android:textSelectHandle
android:textSelectHandleLeft
android:textSelectHandleRight
瞧,自定义颜色的光标和选择手柄与默认材质设计版本完全匹配,避免反射,因此不会导致警告或错误。
好的,在深入研究Android Pie源代码后,我发现Google已经将mCursorDrawable
更改为mdraawableForCursor
,并且还将其类型从两元素Drawable
数组更改为简单的Drawable
,因此我在原始反射方法的基础上做了一些更改,现在它适用于Android P:
public static void setEditTextCursorColor(EditText editText, int color) {
try {
// Get the cursor resource id
Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
field.setAccessible(true);
int drawableResId = field.getInt(editText);
// Get the editor
field = TextView.class.getDeclaredField("mEditor");
field.setAccessible(true);
Object editor = field.get(editText);
// Get the drawable and set a color filter
Drawable drawable = ContextCompat.getDrawable(editText.getContext(), drawableResId);
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
// Set the drawables
if(Build.VERSION.SDK_INT >= 28){//set differently in Android P (API 28)
field = editor.getClass().getDeclaredField("mDrawableForCursor");
field.setAccessible(true);
field.set(editor, drawable);
}else {
Drawable[] drawables = {drawable, drawable};
field = editor.getClass().getDeclaredField("mCursorDrawable");
field.setAccessible(true);
field.set(editor, drawables);
}
//optionally set the "selection handle" color too
setEditTextHandleColor(editText, color);
} catch (Exception ignored) {}
}
顺便说一句,我真的希望谷歌能添加一个像setCursorDrawable()之类的公共方法,那样会容易得多。
通过RGB值设置光晕的颜色。 光晕的默认颜色是 0xFFFFFF: // 颜色的参数可以是字符串 "#FF0000" 或者是十六进制数值 0xFF0000 controller.setHaloColor("#FF0000"); //controller.setHaloColor(0xFF0000);
问题内容: 如何使用jQuery在文本字段中设置光标位置?我有一个带有内容的文本字段,我希望用户将光标放在该字段上时将光标定位在某个偏移处。该代码应该看起来像这样: 该setCursorPosition函数的实现是什么样的?如果您的文本字段的内容为abcdefg,则此调用将导致光标的定位如下:abcd | efg。 Java具有类似的功能setCaretPosition。javascript是否存
本文向大家介绍javascript设置文本框光标的方法实例小结,包括了javascript设置文本框光标的方法实例小结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了javascript设置文本框光标的方法。分享给大家供大家参考,具体如下: 对于text 对于textarea 设置光标函数 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript查找算法技巧总
问题内容: 我正在与一个非开源项目合作,我需要修改一个或多个其类。 在一个类中是以下集合: 我需要做的就是在这里使用反射和并发hashmap。我试过下面的代码,但是不起作用。 问题答案: 希望这是您要尝试做的事情: 它打印:
我有一个浅色主题但深色动作栏的应用程序。所以我的颜色控制激活是我的主色(绿色),在浅色背景下,编辑文本光标是绿色的。问题是我的动作栏是绿色的,所以当在动作栏中使用搜索文本时,我看不到光标,因为它是相同的颜色。我如何仅在动作栏中将光标颜色更改为白色?
问题内容: 如何为网页中的鼠标光标分配颜色? 谁能建议我使用HTML,CSS,JavaScript等任何技术来做到这一点的方法? 问题答案: 将图片与CSS 属性一起使用,我看不到需要JavaScript继承人… 如前所述,我只使用了其中的一种,只是以防万一您的图像无法加载,就像我们声明了多个字体系列一样。