ImageSpan中的Selector drawable不起作用?

时间:2012-06-29 21:12:31

标签: android

是否可以在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,你能提供任何方法来获得相同的结果吗?

2 个答案:

答案 0 :(得分:7)

这不是Android中的错误,但更多是使用跨度的限制。跨度意味着一些基本的文本样式,而不是(复杂的)用户交互,可能涉及或可能不涉及状态等。基本上,您应该考虑跨度内的任何内容都是静态的。选择器对TextView内的所有文本起作用的事实是由TextView本身引起的,与底层跨度无关。

ImageSpan上的选择器不起作用的原因仅仅是因为ImageSpan不知道状态,并且因为没有任何内容可以通知它任何状态更改。这可能是你可以认为是TextView的责任,但另一方面,问自己以下问题:你是否真的希望TextView迭代所有不同的跨度来通知他们国家更新?

话虽如此,绝对有可能修改(可能)ImageSpanTextView以启用对底层跨度的状态感知,但这需要做一些事情。接下来最好的事情是使用TextView的复合可绘制特征,它允许您在TextView内的左侧,顶部,右侧或底部放置最多四个可绘制的(但不是内联)。快速浏览一下源代码,可以看出复合绘图是状态感知的。

完全不同的说明:我曾answered a question与你的相关。它涉及在ImageSpan内制作动画GIF动画。它绝对不是很漂亮,但它可能会帮助你理解不被国家意识到的一点。此外,如果您决定继续执行您自己的问题,也许它会给您一些指示/想法。

答案 1 :(得分:0)

我还没有测试,但它应该正常工作......

实施onTouch的{​​{1}}并在其上处理TextViewACTION_UP ...简单易行。