【问题标题】:Selector drawable in ImageSpan does not work?ImageSpan 中的可绘制选择器不起作用?
【发布时间】:2012-07-05 08:56:09
【问题描述】:

ImageSpan中可以使用selectordrawable吗?

我有带有选择器文本颜色的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,你能提供任何方法来达到同样的结果吗?

【问题讨论】:

标签: android


【解决方案1】:

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

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

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

在一个完全不同的注释上:我曾经answered a question 与你的相关。它处理在ImageSpan 中制作动画 GIF 动画。它绝对不漂亮,但它可能会帮助你理解关于不了解状态的一点。此外,如果您决定就自己的问题继续实施,也许它可以给您一些指示/想法。

【讨论】:

  • 感谢您的回复。我考虑在文本视图的左侧添加图像,但在我的情况下它应该是内联的,所以这不是一个选项。
  • 澄清一下——“复合drawables”确实是状态感知的并且像魅力一样工作。不幸的是,您无法像人们希望的那样控制那里的位置......
【解决方案2】:

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

实现TextViewonTouch并在其上处理ACTION_UPACTION_DOWN...简单易行。

【讨论】:

  • 这是“手工”解决方案。我认为在任何文本视图上都应该有一些通用的方法来做到这一点
猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2014-08-07
相关资源
最近更新 更多