Pertanyaan Apakah mungkin untuk menampilkan gambar sebaris dari html di Android TextView?


Diberikan HTML berikut:

<p>This is text and this is an image <img src="http://www.example.com/image.jpg" />.</p>

Apakah mungkin untuk membuat gambar render? Saat menggunakan cuplikan ini: mContentText.setText(Html.fromHtml(text));, Saya mendapatkan kotak cyan dengan batas hitam, menuntun saya untuk percaya bahwa TextView memiliki beberapa gagasan tentang apa itu img tag.


75
2018-05-19 12:30


asal


Jawaban:


Jika Anda melihat pada dokumentasi untuk Html.fromHtml(text) Anda akan melihatnya mengatakan:

Apa saja <img> tag dalam HTML akan ditampilkan sebagai gambar pengganti generik yang dapat digantikan oleh program Anda dan diganti dengan gambar nyata.

Jika Anda tidak ingin melakukan penggantian ini sendiri, Anda dapat menggunakannya yang lain Html.fromHtml() metode yang membutuhkan Html.TagHandler dan sebuah Html.ImageGetter sebagai argumen serta teks untuk mengurai.

Dalam kasus Anda, Anda bisa mengurai null adapun untuk Html.TagHandler tetapi Anda harus menerapkannya sendiri Html.ImageGetter karena tidak ada implementasi standar.

Namun, masalah yang akan Anda hadapi adalah bahwa Html.ImageGetter harus berjalan serempak dan jika Anda mengunduh gambar dari web, Anda mungkin ingin melakukannya secara asinkron. Jika Anda dapat menambahkan gambar yang ingin ditampilkan sebagai sumber daya dalam aplikasi Anda, Anda ImageGetter implementasi menjadi jauh lebih sederhana. Anda bisa lolos dengan sesuatu seperti:

private class ImageGetter implements Html.ImageGetter {

    public Drawable getDrawable(String source) {
        int id;

        if (source.equals("stack.jpg")) {
            id = R.drawable.stack;
        }
        else if (source.equals("overflow.jpg")) {
            id = R.drawable.overflow;
        }
        else {
            return null;
        }

        Drawable d = getResources().getDrawable(id);
        d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());
        return d;
    }
};

Anda mungkin ingin mencari tahu sesuatu yang lebih cerdas untuk memetakan string sumber ke ID sumber daya.


114
2018-05-19 13:35



Saya telah menerapkan di aplikasi saya, mengambil referensi dari pskink.Terima kasih banyak

package com.example.htmltagimg;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LevelListDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.Spanned;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity implements ImageGetter {
private final static String TAG = "TestImageGetter";
private TextView mTv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String source = "this is a test of <b>ImageGetter</b> it contains " +
            "two images: <br/>" +
            "<img src=\"http://developer.android.com/assets/images/dac_logo.png\"><br/>and<br/>" +
            "<img src=\"http://www.hdwallpapersimages.com/wp-content/uploads/2014/01/Winter-Tiger-Wild-Cat-Images.jpg\">";
    String imgs="<p><img alt=\"\" src=\"http://images.visitcanberra.com.au/images/canberra_hero_image.jpg\" style=\"height:50px; width:100px\" />Test Article, Test Article, Test Article, Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,v</p>";
    String src="<p><img alt=\"\" src=\"http://stylonica.com/wp-content/uploads/2014/02/Beauty-of-nature-random-4884759-1280-800.jpg\" />Test Attractions Test Attractions Test Attractions Test Attractions</p>";
    String img="<p><img alt=\"\" src=\"/site_media/photos/gallery/75b3fb14-3be6-4d14-88fd-1b9d979e716f.jpg\" style=\"height:508px; width:640px\" />Test Article, Test Article, Test Article, Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,Test Article,v</p>";
    Spanned spanned = Html.fromHtml(imgs, this, null);
    mTv = (TextView) findViewById(R.id.text);
    mTv.setText(spanned);
}

@Override
public Drawable getDrawable(String source) {
    LevelListDrawable d = new LevelListDrawable();
    Drawable empty = getResources().getDrawable(R.drawable.ic_launcher);
    d.addLevel(0, 0, empty);
    d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());

    new LoadImage().execute(source, d);

    return d;
}

class LoadImage extends AsyncTask<Object, Void, Bitmap> {

    private LevelListDrawable mDrawable;

    @Override
    protected Bitmap doInBackground(Object... params) {
        String source = (String) params[0];
        mDrawable = (LevelListDrawable) params[1];
        Log.d(TAG, "doInBackground " + source);
        try {
            InputStream is = new URL(source).openStream();
            return BitmapFactory.decodeStream(is);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        Log.d(TAG, "onPostExecute drawable " + mDrawable);
        Log.d(TAG, "onPostExecute bitmap " + bitmap);
        if (bitmap != null) {
            BitmapDrawable d = new BitmapDrawable(bitmap);
            mDrawable.addLevel(1, 1, d);
            mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
            mDrawable.setLevel(1);
            // i don't know yet a better way to refresh TextView
            // mTv.invalidate() doesn't work as expected
            CharSequence t = mTv.getText();
            mTv.setText(t);
        }
    }
}
}

Sesuai di bawah @rpgmaker komentar saya menambahkan jawaban ini

ya bisa Anda gunakan ResolveInfo kelas

periksa file Anda didukung dengan aplikasi yang sudah diinstal atau tidak

menggunakan kode di bawah ini:

private boolean isSupportedFile(File file) throws PackageManager.NameNotFoundException {
    PackageManager pm = mContext.getPackageManager();
    java.io.File mFile = new java.io.File(file.getFileName());
    Uri data = Uri.fromFile(mFile);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(data, file.getMimeType());
    List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

    if (resolveInfos != null && resolveInfos.size() > 0) {
        Drawable icon = mContext.getPackageManager().getApplicationIcon(resolveInfos.get(0).activityInfo.packageName);
        Glide.with(mContext).load("").placeholder(icon).into(binding.fileAvatar);
        return true;
    } else {
        Glide.with(mContext).load("").placeholder(R.drawable.avatar_defaultworkspace).into(binding.fileAvatar);
        return false;
    }
}

12
2018-02-11 18:25



Ini adalah apa yang saya gunakan, yang tidak membutuhkan Anda untuk meng-hardcore nama sumber daya Anda dan akan mencari sumber daya yang dapat ditarik terlebih dahulu di sumber daya aplikasi Anda dan kemudian dalam sumber daya android saham jika tidak ditemukan - memungkinkan Anda untuk menggunakan ikon default dan semacamnya.

private class ImageGetter implements Html.ImageGetter {

     public Drawable getDrawable(String source) {
        int id;

        id = getResources().getIdentifier(source, "drawable", getPackageName());

        if (id == 0) {
            // the drawable resource wasn't found in our package, maybe it is a stock android drawable?
            id = getResources().getIdentifier(source, "drawable", "android");
        }

        if (id == 0) {
            // prevent a crash if the resource still can't be found
            return null;    
        }
        else {
            Drawable d = getResources().getDrawable(id);
            d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());
            return d;
        }
     }

 }

Yang dapat digunakan seperti itu (contoh):

String myHtml = "This will display an image to the right <img src='ic_menu_more' />";
myTextview.setText(Html.fromHtml(myHtml, new ImageGetter(), null);

9
2018-03-10 11:25



Saya menghadapi masalah yang sama dan saya telah menemukan solusi yang cukup bersih: Setelah Html.fromHtml () Anda dapat menjalankan AsyncTask yang mengiterasi ulang semua tag, menjemput gambar dan kemudian menampilkannya.

Di sini Anda dapat menemukan beberapa kode yang dapat Anda gunakan (tetapi perlu beberapa penyesuaian): https://gist.github.com/1190397


5
2017-09-03 02:03



Saya menggunakan jawaban Dave Webb tetapi sedikit menyederhanakannya. Selama ID sumber daya akan tetap sama selama waktu proses dalam kasus penggunaan Anda, tidak ada kebutuhan untuk menulis penerapan kelas Anda sendiri Html.ImageGetter dan dipusingkan dengan sumber-string.

Apa yang saya lakukan adalah menggunakan ID sumber daya sebagai string-sumber:

final String img = String.format("<img src=\"%s\"/>", R.drawable.your_image);
final String html = String.format("Image: %s", img);

dan gunakan secara langsung:

Html.fromHtml(html, new Html.ImageGetter() {
  @Override
  public Drawable getDrawable(final String source) {
    Drawable d = null;
    try {
      d = getResources().getDrawable(Integer.parseInt(source));
      d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
    } catch (Resources.NotFoundException e) {
      Log.e("log_tag", "Image not found. Check the ID.", e);
    } catch (NumberFormatException e) {
      Log.e("log_tag", "Source string not a valid resource ID.", e);
    }

    return d;
  }
}, null);

3
2018-01-17 14:52



Anda juga bisa menulis parser Anda sendiri untuk menarik URL semua gambar dan kemudian secara dinamis membuat tampilan gambar baru dan meneruskannya ke url.


1
2018-06-25 04:41



Juga, jika Anda ingin melakukan penggantian sendiri, karakter yang perlu Anda cari adalah [].

Tetapi jika Anda menggunakan Eclipse, itu akan menjadi panik ketika Anda mengetikkan huruf itu ke dalam pernyataan [ganti] yang memberi tahu Anda bahwa itu bertentangan dengan Cp1252 - ini adalah bug Eclipse. Untuk memperbaikinya, buka

Jendela -> Preferensi -> Umum -> Ruang Kerja -> Enkode file teks,

dan pilih [UTF-8]


1
2018-06-25 04:20



Jika seseorang berpikir bahwa sumber daya harus deklaratif dan menggunakan Spannable untuk beberapa bahasa berantakan, saya melakukan beberapa tampilan khusus

import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.Spanned;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * XXX does not support android:drawable, only current app packaged icons
 *
 * Use it with strings like <string name="text"><![CDATA[Some text <img src="some_image"></img> with image in between]]></string>
 * assuming there is @drawable/some_image in project files
 *
 * Must be accompanied by styleable
 * <declare-styleable name="HtmlTextView">
 *    <attr name="android:text" />
 * </declare-styleable>
 */

public class HtmlTextView extends TextView {

    public HtmlTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HtmlTextView);
        String html = context.getResources().getString(typedArray.getResourceId(R.styleable.HtmlTextView_android_text, 0));
        typedArray.recycle();

        Spanned spannedFromHtml = Html.fromHtml(html, new DrawableImageGetter(), null);
        setText(spannedFromHtml);
    }

    private class DrawableImageGetter implements ImageGetter {
        @Override
        public Drawable getDrawable(String source) {
            Resources res = getResources();
            int drawableId = res.getIdentifier(source, "drawable", getContext().getPackageName());
            Drawable drawable = res.getDrawable(drawableId, getContext().getTheme());

            int size = (int) getTextSize();
            int width = size;
            int height = size;

//            int width = drawable.getIntrinsicWidth();
//            int height = drawable.getIntrinsicHeight();

            drawable.setBounds(0, 0, width, height);
            return drawable;
        }
    }
}

melacak pembaruan, jika ada, di https://gist.github.com/logcat/64234419a935f1effc67


0
2018-01-05 09:59