是否可以在selector
中使用ImageSpan
drawable?
我有TextView
选择器文本颜色,并添加带选择器资源的ImageSpan。文本颜色更改工作正常,图像不会更改。这是一个错误还是有办法让选择器跨度?
我的TextView
:
<TextView
android:id="@+id/text"
android:ellipsize="end"
android:layout_height="fill_parent"
android:duplicateParentState="true" // parent of this text view can be selected
android:gravity="center_vertical"
android:lines="1"
android:textColor="@color/message_content_simple_text" // here is selector - it works fine
android:textSize="15dp" />
选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_active" android:state_focused="true"/>
<item android:drawable="@drawable/ic_active" android:state_selected="true"/>
<item android:drawable="@drawable/ic_active" android:state_pressed="true"/>
<item android:drawable="@drawable/ic_passive"/>
</selector>
添加span的代码:
SpannableString text = new SpannableString(" some text");
ImageSpan span = new ImageSpan(context, R.drawable.icon, ImageSpan.ALIGN_BASELINE);
text.setSpan(span, 0, 1, SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(text);
当我选择此文本视图时,“某些文本”会根据需要更改其颜色,但图像不会更改。
修改
如果有一些android bug,你能提供任何方法来获得相同的结果吗?
答案 0 :(得分:7)
这不是Android中的错误,但更多是使用跨度的限制。跨度意味着一些基本的文本样式,而不是(复杂的)用户交互,可能涉及或可能不涉及状态等。基本上,您应该考虑跨度内的任何内容都是静态的。选择器对TextView
内的所有文本起作用的事实是由TextView
本身引起的,与底层跨度无关。
ImageSpan
上的选择器不起作用的原因仅仅是因为ImageSpan
不知道状态,并且因为没有任何内容可以通知它任何状态更改。这可能是你可以认为是TextView
的责任,但另一方面,问自己以下问题:你是否真的希望TextView
迭代所有不同的跨度来通知他们国家更新?
话虽如此,绝对有可能修改(可能)ImageSpan
和TextView
以启用对底层跨度的状态感知,但这需要做一些事情。接下来最好的事情是使用TextView
的复合可绘制特征,它允许您在TextView
内的左侧,顶部,右侧或底部放置最多四个可绘制的(但不是内联)。快速浏览一下源代码,可以看出复合绘图是状态感知的。
完全不同的说明:我曾answered a question与你的相关。它涉及在ImageSpan
内制作动画GIF动画。它绝对不是很漂亮,但它可能会帮助你理解不被国家意识到的一点。此外,如果您决定继续执行您自己的问题,也许它会给您一些指示/想法。
答案 1 :(得分:0)
我还没有测试,但它应该正常工作......
实施onTouch
的{{1}}并在其上处理TextView
和ACTION_UP
...简单易行。