यह उत्तर इस उत्कृष्ट उत्तर पर 18446744073709551615 द्वारा आधारित है । उनका समाधान, हालांकि उपयोगी है, आसपास के पाठ के साथ छवि आइकन को आकार नहीं देता है। यह आसपास के टेक्स्ट के आइकन आइकन को भी सेट नहीं करता है।
नीचे दिया गया समाधान एक सफेद, चौकोर आइकन लेता है और इसे आसपास के पाठ के आकार और रंग के अनुरूप बनाता है।
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);
}
}
कैसे इस्तेमाल करे:
बस पाठ में वांछित आइकन के संदर्भ एम्बेड करें। इससे कोई फर्क नहीं पड़ता कि क्या पाठ प्रोग्राम के माध्यम से सेट किया गया है textView.setText(R.string.string_resource);
या यदि यह xml में सेट है।
Example.png नामक एक ड्रा करने योग्य आइकन को एम्बेड करने के लिए, पाठ में निम्नलिखित स्ट्रिंग शामिल करें [img src=example/]
:।
उदाहरण के लिए, एक स्ट्रिंग संसाधन इस तरह दिख सकता है:
<string name="string_resource">This [img src=example/] is an icon.</string>