我需要创建一个放在TextView中的String,它将显示如下字符串:
第一部分不大胆 大胆 休息不大胆
所以我想知道如何使用它SpannableStringBuilder来做到这一点?
我可以使用三个TextEdit来完成这个,但我想使用最佳解决方案.
假设我有下一个文本:
你好stackOverflow
我希望将第二个单词设置为RelativeSizeSpan(设置相对字体大小)和TextAppearanceSpan(设置文本的颜色),如何将它们合并?
我所知道的是我可以选择其中一个,例如使用下一个代码:
final SpannableString textToShow = new SpannableString("Hello stackOverflow");
textToShow.setSpan(new RelativeSizeSpan(1.5f), textToShow.length() - "stackOverflow".length(),textToShow.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(textToShow);
Run Code Online (Sandbox Code Playgroud)
但我还需要设置颜色,甚至添加其他跨越类的其他功能......
我能做什么 ?
我正在尝试构造一个SpannableString,使它看起来像这样:

两个字符(m,s)应小于其余字符.我试图在一个SpannableString中保存所有文本,并且我还尝试通过SpannableStringBuilder连接两个SpannableStrings.一个Spannable的代码如下所示:
spannable.setSpan(new RelativeSizeSpan(0.75f), spannable.length() - 1, spannable.length(), 0);
Run Code Online (Sandbox Code Playgroud)
但是,只应用了一种格式 - 使用SpannableStringBuilder时,只有"m"更小,而对整个文本使用一个SpannableString时,只有"s"更小.
调试还显示Spannables似乎只包含一个RelativeSizeSpan实例,这意味着一个类型只能有一个Span.这是真实的还是预期的行为?是否建议连接TextViews?
编辑:顺便说一下,我试图在这里删除HTML.fromHtml()调用性能原因(许多GC调用).
我有以下字符串RM123.456.我想要
我几乎可以通过使用来实现它
spannableString.setSpan(new RelativeSizeSpan(0.50f), 0, index, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString, TextView.BufferType.SPANNABLE);
Run Code Online (Sandbox Code Playgroud)
结果看起来像
但是,它与底部对齐.它没有与顶部对齐.
我试着用SuperscriptSpan.看起来像
它没有做我想要的
SuperscriptSpan不会使文字变小.我无法控制其尺寸.SuperscriptSpan 将使文本"在顶部对齐"我可以知道,我怎样才能让RelativeSizeSpan 准确对齐?
这就是我希望实现的目标.
请注意,我们不希望使用2 TextViews解决方案.
我想创建类似于此图像上看到的内容:

我设法使用SpannableStringBuilder创建evertyhing,橙色圆角矩形除外.我可以使用BackgroundColorSpan将背景设置为该颜色,但我找不到一种方法使其圆整.任何想法我怎样才能做到这一点?
提前致谢!
编辑:我正在使用Xamarin.Android,但这是我的代码:
stringBuilder.SetSpan(new BackgroundColorSpan(Application.Context.Resources.GetColor(Resource.Color.orangeColor)), stringBuilder.Length() - length, stringBuilder.Length(), SpanTypes.ExclusiveExclusive);
Run Code Online (Sandbox Code Playgroud) 假设您有以下字符串:
String s = "The cold hand reaches for the %1$s %2$s Ellesse's";
String old = "old";
String tan = "tan";
String formatted = String.format(s,old,tan); //"The cold hand reaches for the old tan Ellesse's"
Run Code Online (Sandbox Code Playgroud)
假设您希望以此字符串结束,但也Span为任何替换的单词设置了特定的集合String.format.
例如,我们还想做以下事情:
Spannable spannable = new SpannableString(formatted);
spannable.setSpan(new StrikethroughSpan(), oldStart, oldStart+old.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(Color.BLUE), tanStart, tanStart+tan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
是否有结识的开始指数的稳健的方式old和tan?
请注意,只搜索'old'会在'cold'中返回'old',因此无效.
什么会的工作,我想,正在寻找%[0-9]$s事前,并计算补偿值以反映在更换String.format.这看起来很令人头疼,我怀疑可能有一种方法String.format可以提供有关其格式化细节的更多信息.好吧,有吗?
我有一个textView和文字就好
"这是带KeyWord的简单文本和浏览链接 "
在上面的文字我想做..
单击链接将打开该URL 并 单击该KeyWord在我的应用程序中打开一个新的活动
此外, 整个TextView还有一个click事件.
请帮我找一个解决方案.谢谢你,MKJParekh

我试图在ImageView周围对齐TextView.我使用以下代码:
private void createSpannableText(){
TextView myTextView = (TextView) findViewById(R.id.textView);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(this.getText(R.string.loren__ipsum__max));
int lengthOfPart1 = builder.length();
builder.append(" ");
builder.append(this.getText(R.string.lorem__ipsum));
Drawable d = getResources().getDrawable(R.drawable.myImage);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); // <---- Very important otherwise your image won't appear
ImageSpan myImage = new ImageSpan(d);
builder.setSpan(myImage, 0, lengthOfPart1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
myTextView.setText(builder);
}
Run Code Online (Sandbox Code Playgroud)
但无法得到确切的结果.我该怎么办?在这种情况下我需要使用SpannableStringBuilder还是有另一种方法.请帮忙.我使用这个帖子http://majaxandroidtips.blogspot.in/2009/06/how-to-have-few-layout-elements-wrap_17.html 来获得解决方案.
PS:我还希望ImageView周围有6dp的边距
我正在使用类似wiki的解析器,为一组标记令牌创建跨度.它正在工作,但在令牌迭代器中我经常需要将a上的部分结果转换SpannableStringBuilder为a SpannableString.这被称为非常频繁,所以我是最有效的解决方案,并避免创建额外的对象.
目前我正在使用;
SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);
Run Code Online (Sandbox Code Playgroud)
然而,这个valueOf调用在内部构建了SpannableString一种从头开始,执行a toString和循环来复制分配spans.
正如SpannableStringBuilder名字所暗示的,我认为,也许有一种更快的方式来获得SpannableString从建设者.这是真的吗?
似乎为了在Android中将SpanSpan添加到Spannable,我必须用Image替换一些文本.例如:
Spannable span = new SpannableString("Foo imageplace Bar!");
Drawable android = context.getResources().getDrawable(R.drawable.android);
android.setBounds(0, 0, 32,32);
ImageSpan image = new ImageSpan(android, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 4, 14, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
这将用图像替换"imageplace".因为我正在处理复杂的多跨文本和重复,所以在我想要android图标的每个地方插入无意义的文本有点令人头疼.但看起来如果跨度的开始和结束是相同的,则不会包含图像.有没有办法解决?
android ×10
spannablestring ×10
spannable ×3
textview ×3
alignment ×1
font-size ×1
imagespan ×1
imageview ×1
linkify ×1
performance ×1