TextView टेक्स्ट में इमेज कैसे जोड़ें?


86

मैंने Google पर चारों ओर खोज की है और इस साइट पर आया हूं, जहां मुझे एक प्रश्न के समान मिला, जिसमें एक TextViewपाठ में एक छवि कैसे शामिल की जाए , उदाहरण के लिए "नमस्ते मेरा नाम [छवि]" है , और इसका उत्तर यह था:

ImageSpan is = new ImageSpan(context, resId);
text.setSpan(is, index, index + strLength, 0);

मैं इस कोड में जानना चाहूंगा,

  1. मुझे संदर्भ में क्या लिखना या करना चाहिए?
  2. क्या मैं text.setSpan()आयात या संदर्भ को पसंद करने के लिए कुछ करना चाहता हूं या इसे पाठ छोड़ दूं?

अगर कोई मेरे लिए इसे तोड़ सकता है जो बहुत सराहना की जाएगी।

जवाबों:


202

इसे इस्तेमाल करे ..

    txtview.setCompoundDrawablesWithIntrinsicBounds(
                    R.drawable.image, 0, 0, 0);

इसे भी देखें .. http://developer.android.com/reference/android/widget/TextView.html

इसे xml फ़ाइल में आज़माएँ

    <TextView
        android:id="@+id/txtStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:drawableLeft="@drawable/image"
        android:drawablePadding="5dp"
        android:maxLines="1"
        android:text="@string/name"/>

मैं "प्रकार TextView से गैर स्थैतिक विधि setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) करने के लिए एक स्थिर संदर्भ नहीं बना सकता" त्रुटि मिली है
Cranosaur

धन्यवाद उमेश xml विधि ने मेरे लिए काम किया। मैं अपने TextViews के लिए xml लेआउट का उपयोग करता हूं इसलिए मुझे नहीं पता कि क्या इससे कोई फर्क पड़ता है और शायद इसलिए यह जावा में काम नहीं कर रहा था।
4

1
@ उमेश लखानी: इस दृष्टिकोण से पाठ में कई ड्राअबेल कैसे संभव हैं?
बेहनम

एक्सएमएल में एक छवि बाएं से खींची जाती है, केंद्र में नहीं।
कूलमाइंड

HI @ उमेश। इसमें कुछ मार्जिन कैसे सेट करें। setCompoundDrawablePaddingकुछ भी नहीं कर रहा है
Prbs

73

कॉम / xyz / customandroid / TextViewWithImages जावा :

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.content.Context;
import android.text.Spannable;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewWithImages extends TextView {

    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) {
        Spannable s = getTextWithImages(getContext(), text);
        super.setText(s, BufferType.SPANNABLE);
    }

    private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance();

    private static boolean addImages(Context context, Spannable spannable) {
        Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");
        boolean hasChanges = false;

        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;
            }
        }
        String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim();
        int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName());
        if (set) {
            hasChanges = true;
            spannable.setSpan(  new ImageSpan(context, id),
                                matcher.start(),
                                matcher.end(),
                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                             );
        }
    }

        return hasChanges;
    }
    private static Spannable getTextWithImages(Context context, CharSequence text) {
        Spannable spannable = spannableFactory.newSpannable(text);
        addImages(context, spannable);
        return spannable;
    }
}

उपयोग:

में रेस / लेआउट / mylayout.xml :

            <com.xyz.customandroid.TextViewWithImages
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFF00"
                android:text="@string/can_try_again"
                android:textSize="12dip"
                style=...
                />

ध्यान दें कि आप चाहें तो TextViewWithImages.java कुछ के अलावा अन्य स्थान में कॉम / xyz / customandroid / , आप भी परिवर्तन करना होगा पैकेज का नाम, com.xyz.customandroidइसके बाद के संस्करण।

में res / values / strings.xml :

<string name="can_try_again">Press [img src=ok16/] to accept or [img src=retry16/] to retry</string>

जहाँ ok16.png और पुनः प्रयास करें ।16.png Res / drawable / folder में आइकन हैं


जब मैं उपयोग textView.setText(R.string.can_try_again);करता हूं तो यह चित्रों को नहीं दिखाता है, इसका सीधा सादा पाठ दिखाता है Press [img src=ok16/] to accept or [img src=retry16/] to retry। कोई मदद? ऐसा इसलिए है क्योंकि मैं छवियों को गतिशील रूप से लोड करना चाहता हूं और उन्हें टेक्स्ट व्यू में सेट करना चाहता हूं।
अनस अज़ीम

@AnasAzeem क्या आप छवि दृश्य के माध्यम से "सामान्य रूप से", ठीक 16 और रिट्री 16 दिखा सकते हैं? क्या आपने TextView के स्थान पर TextViewWithImages निर्दिष्ट किया था?
18446744073709551615

1
मत भूलना बदलने के लिए <com.xyz.customandroid.TextViewWithImages साथ <YourPackageName.TextViewWithImages अन्यथा आप बढ़ा-चढ़ाकर और NoClassFound अपवाद में एक त्रुटि मिली
AndroidGeek

1
इसके काम करने के लिए, लेकिन मैंने छवि की ऊँचाई चौड़ाई निर्धारित नहीं की है और पाठ के केंद्र में भी छवि नहीं मिल रही है
राजेश कोशी

1
जब तक आप इसे रिलीज़ बिल्ड में पैकेज नहीं करते, तब तक यह एक बेहतरीन क्लास है। यह दुर्घटनाग्रस्त हो गया है और मुझे अभी तक पता नहीं चल पाया है कि क्यों। यहां तक ​​कि प्रहरी में इस वर्ग के प्रशासन को चिह्नित किया। फिर भी नसीब नहीं। या हो सकता है कि मैं जिन चित्रों का उपयोग करता हूं, वे वेक्टर हैं, इसलिए शायद यह दुर्घटनाग्रस्त हो गया है। मुझे नहीं पता।
उदयदित्य बरुआ

18

मैंने कई अलग-अलग समाधानों की कोशिश की और यह मेरे लिए सबसे अच्छा था:

SpannableStringBuilder ssb = new SpannableStringBuilder(" Hello world!");
ssb.setSpan(new ImageSpan(context, R.drawable.image), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv_text.setText(ssb, TextView.BufferType.SPANNABLE);

यह कोड न्यूनतम मेमोरी का उपयोग करता है।


2
उस मामले में छवि को जोड़ा गया है, लेकिन पाठ की आधार रेखा के साथ संरेखित करना चाहता हूं, तो आप पाठ के शीर्ष के साथ संरेखित कर सकते हैं क्या आप मेरी मदद कर सकते हैं
humayoon siddique

2
यह काम करता है लेकिन हम टेक्स्ट साइज के अनुसार इमेज आइकन का आकार कैसे बदल सकते हैं
सुनील कुशवाह

12

यह उत्तर इस उत्कृष्ट उत्तर पर 18446744073709551615 द्वारा आधारित है । उनका समाधान, हालांकि उपयोगी है, आसपास के पाठ के साथ छवि आइकन को आकार नहीं देता है। यह आसपास के टेक्स्ट के आइकन आइकन को भी सेट नहीं करता है।

नीचे दिया गया समाधान एक सफेद, चौकोर आइकन लेता है और इसे आसपास के पाठ के आकार और रंग के अनुरूप बनाता है।

public class TextViewWithImages extends TextView {

    private static final String DRAWABLE = "drawable";
    /**
     * Regex pattern that looks for embedded images of the format: [img src=imageName/]
     */
    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;
    }

    /**
     * Create an ImageSpan for the given icon drawable. This also sets the image size and colour.
     * Works best with a white, square icon because of the colouring and resizing.
     *
     * @param context       The Android Context.
     * @param drawableResId A drawable resource Id.
     * @param size          The desired size (i.e. width and height) of the image icon in pixels.
     *                      Use the lineHeight of the TextView to make the image inline with the
     *                      surrounding text.
     * @param colour        The colour (careful: NOT a resource Id) to apply to the image.
     * @return An ImageSpan, aligned with the bottom of the text.
     */
    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>

3
यह एक अच्छा उपाय है। मैं केवल एक सुधार का सुझाव दूंगा: drawable.setColorFilter से पहले drawable.mutate () जोड़ें; यदि ऐसा नहीं कर रहे हैं, तो आपके पास अपने ऐप के अन्य हिस्सों में एक अलग रंग के साथ ड्रॉबल होगा।
मूंड्रॉइड

@moondroid सुझाव के लिए धन्यवाद, मैंने तदनुसार उत्तर संपादित किया।
मोनिका

वास्तव में मुझे एक समस्या थी, क्योंकि मेरा ड्रॉबल वर्गाकार नहीं है, और यह सॉल्यूशन हमेशा
ड्रॉएबल हाइट के साथ ड्रॉएबल

1

यह आंशिक रूप से @A बॉशमैन द्वारा ऊपर दिए गए पहले के उत्तर पर आधारित है । उस समाधान में, मैंने पाया कि छवि के इनपुट आकार ने इसकी क्षमता को बहुत प्रभावित कियाmakeImageSpan() को ठीक से केंद्र-संरेखित । इसके अतिरिक्त, मैंने पाया कि समाधान ने अनावश्यक लाइन रिक्ति बनाकर पाठ रिक्ति को प्रभावित किया।

मुझे बेसइमेजस्पैन (फेसबुक की फ्रेस्को लाइब्रेरी से) विशेष रूप से अच्छी तरह से काम करने के लिए मिला:

 /**
 * Create an ImageSpan for the given icon drawable. This also sets the image size. Works best
 * with a square icon because of the sizing
 *
 * @param context       The Android Context.
 * @param drawableResId A drawable resource Id.
 * @param size          The desired size (i.e. width and height) of the image icon in pixels.
 *                      Use the lineHeight of the TextView to make the image inline with the
 *                      surrounding text.
 * @return An ImageSpan, aligned with the bottom of the text.
 */
private static BetterImageSpan makeImageSpan(Context context, int drawableResId, int size) {
    final Drawable drawable = context.getResources().getDrawable(drawableResId);
    drawable.mutate();
    drawable.setBounds(0, 0, size, size);
    return new BetterImageSpan(drawable, BetterImageSpan.ALIGN_CENTER);
}

फिर spannable.setSpan()हमेशा की तरह अपने बेहतरImageSpan उदाहरण की आपूर्ति करें


0

यह आपकी मदद कर सकता है

  SpannableStringBuilder ssBuilder;

        ssBuilder = new SpannableStringBuilder(" ");
        // working code ImageSpan image = new ImageSpan(textView.getContext(), R.drawable.image);
        Drawable image = ContextCompat.getDrawable(textView.getContext(), R.drawable.image);
        float scale = textView.getContext().getResources().getDisplayMetrics().density;
        int width = (int) (12 * scale + 0.5f);
        int height = (int) (18 * scale + 0.5f);
        image.setBounds(0, 0, width, height);
        ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BASELINE);
        ssBuilder.setSpan(
                imageSpan, // Span to add
                0, // Start of the span (inclusive)
                1, // End of the span (exclusive)
                Spanned.SPAN_INCLUSIVE_EXCLUSIVE);// Do not extend the span when text add later

        ssBuilder.append(" " + text);
        ssBuilder = new SpannableStringBuilder(text);
        textView.setText(ssBuilder);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.