Câu trả lời này dựa trên câu trả lời xuất sắc này của 18446744073709551615 . Giải pháp của họ, mặc dù hữu ích, không kích thước biểu tượng hình ảnh bằng văn bản xung quanh. Nó cũng không đặt màu biểu tượng thành màu của văn bản xung quanh.
Giải pháp dưới đây có một biểu tượng hình vuông, màu trắng và làm cho nó phù hợp với kích thước và màu sắc của văn bản xung quanh.
public class TextViewWithImages extends TextView {
private static final String DRAWABLE = "drawable";
public static final String PATTERN = "\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E";
public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public TextViewWithImages(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextViewWithImages(Context context) {
super(context);
}
@Override
public void setText(CharSequence text, BufferType type) {
final Spannable spannable = getTextWithImages(getContext(), text, getLineHeight(), getCurrentTextColor());
super.setText(spannable, BufferType.SPANNABLE);
}
private static Spannable getTextWithImages(Context context, CharSequence text, int lineHeight, int colour) {
final Spannable spannable = Spannable.Factory.getInstance().newSpannable(text);
addImages(context, spannable, lineHeight, colour);
return spannable;
}
private static boolean addImages(Context context, Spannable spannable, int lineHeight, int colour) {
final Pattern refImg = Pattern.compile(PATTERN);
boolean hasChanges = false;
final Matcher matcher = refImg.matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end()) {
spannable.removeSpan(span);
} else {
set = false;
break;
}
}
final String resName = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim();
final int id = context.getResources().getIdentifier(resName, DRAWABLE, context.getPackageName());
if (set) {
hasChanges = true;
spannable.setSpan(makeImageSpan(context, id, lineHeight, colour),
matcher.start(),
matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
);
}
}
return hasChanges;
}
private static ImageSpan makeImageSpan(Context context, int drawableResId, int size, int colour) {
final Drawable drawable = context.getResources().getDrawable(drawableResId);
drawable.mutate();
drawable.setColorFilter(colour, PorterDuff.Mode.MULTIPLY);
drawable.setBounds(0, 0, size, size);
return new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
}
}
Cách sử dụng:
Chỉ cần nhúng tham chiếu đến các biểu tượng mong muốn trong văn bản. Không quan trọng là văn bản được đặt theo chương trình thông qua textView.setText(R.string.string_resource);
hay nếu nó được đặt trong xml.
Để nhúng một biểu tượng drawable tên example.png, bao gồm các chuỗi sau đây trong văn bản: [img src=example/]
.
Ví dụ: một tài nguyên chuỗi có thể trông như thế này:
<string name="string_resource">This [img src=example/] is an icon.</string>