我目前正在使用 SpannableString 在单个 TextView 中格式化大块文本。大小和颜色的格式都很好,但我在对齐方面遇到了困难。
我发现这篇文章提供了有关对齐格式的指导,以及有关如何使用 AlignmentSpan 的Android 开发人员页面,但它似乎对我不起作用。Eclipse 没有显示任何错误,应用程序加载/运行得很好,但对齐部分似乎完全被忽略了。这是我的代码:
Spannable t = new SpannableString("Test Blue.");
t.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_blue)), 0, t.length()-1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
t.setSpan(new AbsoluteSizeSpan((int) getResources().getDimension(R.dimen.big_text)), 0, t.length()-1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
t.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), 0, t.length()-1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text3.setText(t);
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激。
[编辑] 我还尝试注释掉颜色和大小 setSpans 以查看是否存在冲突,但没有运气。
[编辑2]:我将下面的答案标记为正确的,但正确的答案实际上隐藏在评论中。我无法将 TextView 的 XML 文件宽度更新为 match_parent(而不是 fill_content)。谢谢塞尔吉!
我想在 a 中获取一种类型的所有跨度CharSequence并将它们转换为不同的类型。例如,将所有粗体跨度转换为下划线跨度:
我该怎么做?
(这是我今天面临的一个问题,既然我现在已经解决了,我在这里添加一个问答对。我的答案如下。)
如何将位图与SpannableString中的文本对齐?
SpannableStringBuilder ssb = new SpannableStringBuilder(arr_messages.get(position));
String msg1 = ssb.toString();
for (int i=0; i<smileys.length; i++)
{
if (msg1.indexOf(smileys[i]) > 0)
{
int t = msg1.indexOf(smileys[i]);
ssb.setSpan(new ImageSpan(bitmapArray.get(i)), t, t+2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
holder.txtName.setText(ssb, BufferType.SPANNABLE);
Run Code Online (Sandbox Code Playgroud)
我想用这些图片来证明这个问题:
我想要的是垂直居中文本和图像(文本没问题,但图像将其拧紧).
结果是:

我正在努力制作一款游戏来帮助孩子们学习数学.我为代码编号,以便他们可以遵循逻辑.我还使用textView.append()来构建一个长字符串以放入活动中.
因为我在指令中重复使用相同的数字/符号,我想要一种方法来轻松回收SpannableStrings,但似乎我所做的更改在第一次正确应用,但此后有时工作,有时部分工作(例如正确的大小)/alignment,但颜色错误),或根本不工作.我正在混合这一切.我似乎无法在Stackoverflow或Google上的任何其他地方找到遇到类似问题的人.
这是我的代码(简化):
// Declare static variables
public static Spannable PLUS = new SpannableString("+ ");
public static Spannable MINUS = new SpannableString("- ");
public static Spannable TIMES = new SpannableString("X ");
public static Spannable DIVIDED_BY = new SpannableString("/ ");
public static Spannable EQUALS = new SpannableString("= ");
// Function to color these strings.
public void colorStrings() {
makeBlack(PLUS);
makeBlack(MINUS);
makeBlack(TIMES);
makeBlack(DIVIDED_BY);
makeBlack(EQUALS);
makeBlack(QMARK);
}
// Function that actually sets color, size, and alignment.
public Spannable makeBlack(Spannable s) {s.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color_black)), 0, …Run Code Online (Sandbox Code Playgroud) 我尝试使用SpannableString在切换按钮上放置一个图标.并且在API17上工作,但在API21上没有.

正如您所看到的,它适用于API17的Button和TextView,但仅在API21上使用TextView('Z'不替换为图标).
private SpannableStringBuilder createSpanIcon(int rid, String name){
Drawable d = getActivity().getResources().getDrawable(rid);
d.setBounds(0,0,20,20);
ImageSpan imageSpan = new ImageSpan(d, DynamicDrawableSpan.ALIGN_BASELINE);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("Z\n")
.append(name)
.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
/* This give same result
builder.append("Z", imageSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("RED", new ForegroundColorSpan(Color.RED), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("\n" + name);
*/
return builder;
}
Run Code Online (Sandbox Code Playgroud)
和
Button btn = (Button)v.findViewById(R.id.myButton);
SpannableStringBuilder _test = createSpanIcon(R.drawable.tc_g, "Click Me!" );
btn.setText( _test );
TextView txt = (TextView)v.findViewById(R.id.myText);
SpannableStringBuilder _test2 = createSpanIcon(R.drawable.tc_g, "I'm text" );
txt.setText( _test2 );
Run Code Online (Sandbox Code Playgroud)
注意:我不想使用setCompoundDrawablesWithIntrinsicBounds …
我正在尝试将All Spans应用于文本,如下所示;
public String getTextWithTags(Editable e)
{
StyleSpan[] ss = e.getSpans(0,e.length(),StyleSpan.class);
ss[0].getSpanStart <--- ? This is the problem, no such function
return "";
}
Run Code Online (Sandbox Code Playgroud)
但是没有索引查找功能来替换标签以将它们存储在数据库中,这样我可以在重新打开文本时检索所有跨度.如何从可编辑对象获得所有跨度位置?
我做了一个自定义的View使用Canvas.drawText()得出一些SpannableString秒。
我SpannableString.setSpan()在文本包含我制作的表情符号时调用(我不喜欢默认样式的表情符号)。我发现Canvas.drawText()它没有绘制我设置的跨度,而是绘制了默认样式的表情符号。我试图TextView.setText()通过相同的方式调用SpannableString它并且它有效。我想用来Canvas绘制文本以提高性能(否则,TextView在滚动时更新几个sListView会导致严重的性能问题)。怎样绘制SpannableString用Canvas?
对不起,我的英语不好,我不是母语人士。感谢提前!
编辑:实际上我做了这个自定义View是为了显示文本转换的动画。几个文本将水平穿过屏幕。我遇到的问题是TextView's draw 方法导致时间太多,动画看起来很糟糕。所以我想直接使用Canvas. 可悲的是,我切换到StaticLayout并仍然发现动画很生涩。
我在中创建了用于突出显示语法的简单代码EditText。首先,我创建了一个HashMap存储关键字和颜色的文件。
Map<String,Integer> map = new HashMap<>();
map.put("public",Color.CYAN);
map.put("void", Color.BLUE);
map.put("String",Color.RED);
Run Code Online (Sandbox Code Playgroud)
然后,我添加了一个TextWatcher为EditText。在afterTextChanged方法中,我使用以下代码为每个关键字设置颜色,
........
@Override
public void afterTextChanged(Editable editable) {
String string = editable.toString();
String[] split = string.split("\\s");
for(int i = 0 ; i < split.length ; i++){
String s = split[i];
if(map.containsKey(s)){
int index = string.indexOf(s);
int color = map.get(s);
editable.setSpan(new ForegroundColorSpan(color),
index,
index + s.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我键入不同的词(例如“ public void String”),则此代码有效,但是当我键入相同的词“ public public public”时,此代码不起作用。它仅将颜色设置为第一个单词。
我该如何工作?谢谢。
我的布局中有一个 TextView,其中包含不同大小的文本:

这是通过 SpannableString 实现的:
SpannableString spannableString = new SpannableString("$20 Rewards");
spannableString.setSpan(
new AbsoluteSizeSpan(getResources().getDimensionPixelSize(R.dimen.textSize_16)), 0,
3, 0);
textView.setText(spannableString);
Run Code Online (Sandbox Code Playgroud)
我的问题是较小的文本不会垂直居中,如上图所示。我已经添加android:gravity="center_vertical"到 TextView,无济于事:
<TextView
android:id="@+id/tv_hotel_rewards"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@drawable/bg_dark_blue_partial_round"
android:gravity="center_vertical"
android:paddingBottom="4dp"
android:paddingEnd="8dp"
android:paddingStart="8dp"
android:paddingTop="4dp"
android:textColor="@color/white"
android:textSize="@dimen/textSize_12"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_hotel_price"
tools:text="$140 Rewards"/>
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何将其垂直居中,或者是否可以使用单个 TextView?
我想在 Android 中动态应用图像范围的背景颜色。
您能提出一些想法吗?
android textview spannablestring imagespan android-spannable