【问题标题】:SpannableString with Image exampleSpannableString 与图像示例
【发布时间】:2011-03-11 16:49:36
【问题描述】:

我正在寻找如何使用 ImageSpan 构建和显示 Android SpannableString 的示例。类似笑脸的内联显示。

非常感谢。

【问题讨论】:

  • 您是否还需要帮助将字符串跨度(顶部、左侧、右侧或底部放置)与输出 SpanableString 中的图像跨度对齐?

标签: android spannable imagespan


【解决方案1】:

找到以下内容,它似乎可以完成这项工作:

public class TestActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    TextView textView  = (TextView) findViewById(R.id.textview); 
    SpannableString ss = new SpannableString("abc"); 
    Drawable d = ContextCompat.getDrawable(this, R.drawable.icon32);
    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); 
    ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
    textView.setText(ss); 
} 

【讨论】:

  • d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 是没有内在边界的 Drawable 的关键。
  • 如果我想调整 ImageSpan 在 spannable .. 字符串中的位置?示例我想从底部到 Imagspan 提供 10 dp 的边距。
  • @Hasan Ali Karaca:我建议你使用:ContextCompat.getDrawable(context, R.drawable.my_drawable);
  • @Khay 我通过使用 VectorDrawable 在视口底部有更多空间来解决它。这并不理想,但似乎比覆盖 ImageSpan 和 draw 方法更简单。
  • @Khay 我在字符串中使用“\n”将字符串放在图像下方。
【解决方案2】:

SpannableString + ImageSpan 在 Android API 21 和 22 中不起作用(我在模拟器中的 Android Studio 1.2.1.1 中进行了测试),但如果您这样做:

TextView textView  = (TextView) findViewById(R.id.textview);
textView.setTransformationMethod(null);
...
textView.setText(ss); 

SpannableString + ImageSpan 将起作用。

我受到这篇文章的启发:https://stackoverflow.com/a/26959656/3706042

【讨论】:

  • 我的运行 API 22 的设备显示 SpannableString + ImageSpan 很好。我正在使用VectorDrawables...
  • 如果文本有标志textAllCaps=true,你会丢失它,如果你重置transformationMethod,它不会变成大写
【解决方案3】:

如果有人仍然感兴趣,我创建了一个 Java 方法,允许递归地将 列出的可绘制对象添加到 text(设置在 textView 的末尾)基于“要替换的字符串”。

public void appendImages(@NonNull TextView textView,
                           @NonNull String text,
                           @NonNull String toReplace,
                           Drawable... drawables){
    if(drawables != null && drawables.length > 0){
        //list of matching positions, if any
        List<Integer> positions = new ArrayList<>();
        int index = text.indexOf(toReplace);
        while (index >= 0) {
            //add position
            positions.add(index);
            index = text.indexOf(toReplace, index + toReplace.length());
        }
        if(positions.size() > 0 && drawables.length >= positions.size()){
            textView.setTransformationMethod(null);
            SpannableString ss = new SpannableString(text);
            int drawablesIndex = 0;
            for(int position : positions){
                Drawable drawable = drawables[drawablesIndex++];
                //mandatory for Drawables
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                ss.setSpan(new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE), position, position+toReplace.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            }
            textView.setText(ss);
        }
        else Timber.w("The amount of matches to replace is %s and the number of drawables to apply is %s", positions.size(), drawables.length);
    }
    else Timber.w("The drawables array is null or empty.");
}

用法:

appendImages(myTextView, "This is a ^ simple ^ test", "^", drawable1, drawable2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多