Android SpannableString与图像示例

Android SpannableString与图像示例,android,spannable,imagespan,Android,Spannable,Imagespan,我正在寻找一个如何使用ImageSpan构建和显示Android SpannableString的示例。类似于微笑的内联显示 非常感谢。找到了以下内容,它似乎可以完成任务: public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContent

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


非常感谢。

找到了以下内容,它似乎可以完成任务:

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); 
} 

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

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

SpannableString+imagesspan将起作用


我受到这篇文章的启发:

如果还有人感兴趣,我已经创建了一个Java方法,允许基于“字符串替换”递归地将列出的可绘图项添加到文本(设置在文本视图的末尾)


d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight())
是没有内在边界的绘图表的键。如果我想调整ImageSpan在Spanable中的位置。。一串示例我想给从底部到Imagspan的间隔10 dp。@哈桑·阿里·卡拉卡:我建议您使用:
ContextCompat.getDrawable(context,R.drawable.my_drawable)@Khay我通过在视口底部使用更大空间的VectorDrawable解决了这个问题。这并不理想,但似乎比重写ImageSpan和draw方法更简单。@Khay我在字符串中使用“\n”将字符串放在图像下方。我运行API
22
的设备显示
SpannableString
+
ImageSpan
很好。不过我正在使用的是
VectorDrawable
s…如果文本有flag
textAllCaps=true
您将丢失它,并且如果您重置TransformationMethod,它将不会大写。您是否还需要帮助将字符串跨度(顶部、左侧、右侧或底部位置)与输出SpanableString中的图像跨度对齐?
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);