- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用一个方法创建了这个类,该方法接收 Spannable 对象并将样式应用于它接收的任何对象。我在具有这些 Spoiler 标签的论坛消息解析器上使用它,其中仅当鼠标光标位于其上时才显示内容。对于android,我想让它通过点击隐藏区域来工作,为此我写了这个:
public static class TextRuleStartSpoiler extends TextRuleStart
{
protected TextRuleStartSpoiler()
{
super("spoiler");
}
ArrayList<Spannable> hiddenSpannables = new ArrayList<Spannable>();
boolean hidden = false;
@Override
public void apply(Spannable s, TextView tv)
{
hiddenSpannables.add(s);
s.setSpan(new BackgroundColorSpan(Color.parseColor("#0A1238")),0,s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(getForegroundColorSpanShown(), 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(getClickableSpanLink(),0,s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
public static TextRuleEnd getRuleEnd()
{
return new TextRuleEnd("spoiler");
}
ForegroundColorSpan foregroundColorSpanHidden = null;
private synchronized ForegroundColorSpan getForegroundColorSpanHidden()
{
if(foregroundColorSpanHidden == null)
{
foregroundColorSpanHidden = new ForegroundColorSpan(Color.parseColor("#0A1238"));
}
return foregroundColorSpanHidden;
}
ForegroundColorSpan foregroundColorSpanShown = null;
private synchronized ForegroundColorSpan getForegroundColorSpanShown()
{
if(foregroundColorSpanShown == null)
{
foregroundColorSpanShown = new ForegroundColorSpan(Color.WHITE);
}
return foregroundColorSpanShown;
}
ClickableSpan clickableSpan = null;
private synchronized ClickableSpan getClickableSpanLink()
{
if(clickableSpan == null)
{
clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget)
{
hidden = !hidden;
if(hidden)
{
for(Spannable s : hiddenSpannables)
{
s.setSpan(getForegroundColorSpanHidden(), 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s.removeSpan(getForegroundColorSpanShown());
}
}
else
{
for(Spannable s : hiddenSpannables)
{
s.setSpan(getForegroundColorSpanShown(), 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s.removeSpan(getForegroundColorSpanHidden());
}
}
widget.invalidate();
}
@Override
public void updateDrawState(TextPaint ds)
{
//super.updateDrawState(ds);
}
};
}
return clickableSpan;
}
}
但是,无论我点击多少次,都没有任何反应。我也尝试过,不是设置和删除 ForegroundColorSpans,而是将方法 updateDrawState 重写为如下所示:
@Override
public void updateDrawState(TextPaint ds)
{
if(hidden)
{
ds.linkColor = Color.parseColor("#0A1238");
}
else
{
ds.linkColor = Color.WHITE;
}
super.updateDrawState(ds);
}
但它也没有改变任何东西。我添加了一些调试日志打印,并且我确信这些方法正在使用正确的参数调用,但它没有以正确的方式更新,即使我尝试在 onClick 之后立即使 View 无效,同时使用 View v on onClick 和 TextView 电视上应用。
由于我编写的代码的性质,我不可能对 TextView 搞太多困惑,因为它将充满其他 Spannable 对象,其规则与具体的规则完全无关。
事实上,问题不在于这部分代码,而在于我如何在 TextView 中插入 Spannable 对象。我正在迭代多个 Spannable,这让我认为我可以使用 TextView.append方法,但是,这会将 BufferType 更改为 EDITABLE,这会禁用文本中的视觉更新,因此我将其更改为
tv.setText(TextUtils.concat(tv.getText(), s), TextView.BufferType.SPANNABLE);
最佳答案
你应该做的是完全重写 updateDrawState 方法的默认实现,不要调用 super 方法。
示例代码(SpoilerSpan):
public class SpoilerSpan extends ClickableSpan {
private boolean shown = false;
public void setShown(boolean shown){
this.shown = shown;
}
public boolean getShown(){
return this.shown;
}
@Override
public void onClick(View widget) {
//Toggle the shown state
setShown(!getShown());
//Invalidate the view
widget.invalidate();
}
@Override
public void updateDrawState(TextPaint ds) {
//Don't call the super method otherwise this may override our settings!
//super.updateDrawState(ds);
//No need to disable the default underline style because the super method isn't called.
//ds.setUnderlineText(false);
if(getShown()){
ds.setColor(Color.BLACK);
ds.bgColor = 0xFFE7DAC2;
} else {
//Spoiler is not shown, make the text color the same as the background color
ds.setColor(0xFFE7DAC2);
ds.bgColor = 0xFFE7DAC2;
}
}
}
用法:
TextView tv = (TextView) findViewById(R.id.test);
tv.setMovementMethod(LinkMovementMethod.getInstance());
SpannableString testText = new SpannableString("This is some text. This is a spoiler and this isn't.");
testText.setSpan(new SpoilerSpan(), 19, 36, Spannable.SPAN_POINT_MARK);
tv.setText(testText, BufferType.SPANNABLE);
结果:
关于java - 如何使用 ClickableSpan 切换 Spannable 前景色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963425/
我有一个 TextView,我想在其中插入笑脸。我正在使用以下代码将笑脸插入 Spannable private static final Map emoticons = new HashMap();
所以我的应用程序应该将用户的输入与应用程序提供的随机引用进行比较,我想用绿色为正确的单词着色,用红色着色错误的单词。 问题是我不知道如何使用 Spannable在一个循环中,尤其是文本总是在变化。 这
我在 Android 上布局文本时遇到以下问题。我基本上试图让两行文本的间距最小,并且每行的样式应该不同。我已经有了相当好的工作解决方案,其中两个单行 TextView 一个放在另一个下面,但我仍然在
我有一个聊天应用程序,可以在文本中添加表情符号。 EditText 字段有问题。表情符号图像出现,但如果我在普通键盘上按下退格按钮,我要更改为表情符号图片的文本就会出现,我必须删除几个字符,直到图片消
我正在使用 SpannableStringBuilder 在 TextView 上设置文本,但它在不同的设备上给我不同的结果。 这里是 spannableString 构建器的代码 Spannabl
我正在尝试将一段很长的文本(来自几个不同的数据)组合成 TextView 的内容。 我希望每一行都具有以下结构: {piece 1} | {piece 2} 我希望每个“{piece 1} |”都是浅
String aux = getInserzionista(offerta.getIdInserzionista()); sotto_titolo.setText("Offerta dal "
有没有办法从字符串资源中提取Spannable[] 东西?基本上类似于 Welcome to Mercury Welcome to Venus Wel
如何在 Spannable 中禁用交互,而不影响显示它的 TextView 的交互? 换句话说,我想禁用给定 Spannable 中的所有链接。我不能对跨度做任何假设(特别是,它们可以是覆盖 upda
我添加这样的文本: tv.setText("This is text created with StringBuilder"); 然后我跟踪用户长按了哪个词,并想在短时间内突出显示该词: tv.set
我需要为 EditText 的一部分设置样式。我希望文本为白色,背景为灰色。看起来很简单,但事实并非如此。 spanRange.setSpan(new BackgroundColorSpan(Colo
在 ListView 中的一行上使用 Button 并且能够使单行 Spannable 和数据库中的数据但是当我单击它时返回整个字符串而不是一个单词这里是我的代码来自 MyAdapter 类 将数据库
我在 RecyclerView CardView 的 SearchView 上设置了一个 Spannable。如果在 CardView 上找到用户输入的文本,该文本将以红色突出显示。清除 Search
我有一个 spannable,比如 [12]。我想读取 [ 和 ] 之间的数字。我怎样才能为 spannable 做到这一点? 最佳答案 Spannable 也是一个 CharSequence。这意味
我想使用自定义字体 为从EditText 中选择的文本设置样式。我在编译时遇到错误。 构造函数 StyleSpan(Typeface) 未定义。 下面是我正在申请的代码。 int start=edit
对于同一个字符串,我有两个 spannable 对象,它们都有不同的样式。我需要合并所有 spannable 对象并将所有样式显示到 TextView 中。 从 Html.fromHtml() 返回之
我试图在 TextView 中显示一段代码.代码行跨越 标签。调用前Html.fromHtml()在 String 上,我可以清楚地看到制表符和换行符,但是当我调用 fromHtml() 时将其转换为
我想合并 3 个 spannable 对象。此代码工作正常: Spannable s1 = new SpannableStringBuilder("bold"); s1.se
我正在准备一个包含用于自定义样式(例如粗体、斜体、下划线、颜色等)的复选框的应用...我对哪种方法对性能有好处感到有点困惑。我试过字体,但是当用户选择两个复选框时,它只显示最后一个值。效果不佳。 最佳
我有一个标签云,其中标签有背景色。不幸的是,我无法获得合适的行间距。 假设这是文本云: tag1 tag2 tag3 tagtext4 tagtext5 这是 TextView 的样式:
我是一名优秀的程序员,十分优秀!