我正在尝试将材质文本选择句柄引入我的应用程序。我从 SDK 中获取了中/右/左手柄(位图)和文本光标(9 块)的可绘制对象,并设置:
<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left_mtrl_alpha</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right_mtrl_alpha</item>
<item name="android:textSelectHandle">@drawable/text_select_handle_middle_mtrl_alpha</item>
<item name="android:textCursorDrawable">@drawable/text_cursor_mtrl_alpha</item>
它按预期工作。然而,在 Lollipop 中,这些可绘制对象在 XML 中使用特定颜色着色android:tint
属性,我无法在 API
也就是说,它们都不是我想要的绿色。为什么?
正如你在上面看到的,我设置了四个ImageView
在我的编辑文本下方,它们反而被着色。
private void setUpTextCursors() {
Drawable left = getResources().getDrawable(R.drawable.text_select_handle_left_mtrl_alpha);
Drawable right = getResources().getDrawable(R.drawable.text_select_handle_right_mtrl_alpha);
Drawable middle = getResources().getDrawable(R.drawable.text_select_handle_middle_mtrl_alpha);
Drawable cursor = getResources().getDrawable(R.drawable.text_cursor_mtrl_alpha);
ColorFilter cf = new PorterDuffColorFilter(mGreenColor, PorterDuff.Mode.SRC_IN);
/**
* tint my ImageViews, but no effect on edit text handles
*/
left.setColorFilter(cf);
right.setColorFilter(cf);
middle.setColorFilter(cf);
/**
* no effect whatsoever
*/
cursor.setColorFilter(cf);
}
看起来这里我们既有一个 9 补丁着色问题 - 因为过滤器即使在测试 ImageView 上也失败 - 以及一个与文本选择管理器没有考虑任何应用的过滤器这一事实相关的问题。
相关源代码来自TextView
class https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java并由此Editor
hidden 辅助类 http://my.fit.edu/~vkepuska/ece5570/adt-bundle-windows-x86_64/sdk/sources/android-16/android/widget/Editor.java我以某种方式找到了它。花了一些时间,但仍然不明白为什么我的过滤器被忽略。
致@pskink:让cursor
是过滤后的可绘制对象,我可以有:
<ImageView
android:id="@id/1"
android:src="@drawable/cursor_drawable" />
<ImageView
android:id="@id/2" />
第一个不会着色,但如果我打电话imageView2.setBackground(cursor)
,然后就着色了。
另外如果我有
<item name="android:textSelectHandle">@drawable/cursor_drawable</item>
这会影响编辑选择(因为我覆盖了默认光标),但它再次没有着色。