5

是否可以使用selectordrawable in ImageSpan

我有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>

以及添加跨度的代码:

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,你能提供任何方法来达到同样的结果吗?

4

2 回答 2

9

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

an 上的选择器ImageSpan不工作的原因仅仅是因为 anImageSpan不知道状态,并且没有任何东西可以通知它任何状态更改。这也许是您认为 a 的责任TextView,但另一方面,问自己以下问题:您是否真的希望 aTextView遍历其所有不同跨度以通知它们状态更新?

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

完全不同的是:我曾经回答过一个与您有关的问题。它处理在ImageSpan. 它绝对不漂亮,但它可能会帮助你理解关于不了解状态的一点。此外,如果您决定就自己的问题继续实施,也许它可以给您一些指示/想法。

于 2012-07-05T00:56:09.123 回答
0

我还没有测试,但它应该可以工作......

实现onTouchTextView处理ACTION_UPACTION_DOWN......简单易行。

于 2012-07-04T04:43:09.793 回答