Html.ImageGetter TextView

Así que estoy usando ImageGetter para mostrar las imágenes de las publicaciones del blog de JSON. Im que consigue la fuente correcta en el registro pero la URL cambia cuando alcanza setBounds. ¿Algunas ideas?

Código:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_blog_view); Intent intent = getIntent(); Uri blogUri = intent.getData(); mPost = blogUri.toString(); mUrl = getIntent().getStringExtra("mUrl"); TextView textView = (TextView) findViewById(R.id.scrollView1); textView.setText(Html.fromHtml(mPost, imgGetter, null)); } private ImageGetter imgGetter = new ImageGetter(){ @Override public Drawable getDrawable(String source){ Drawable drawable = Drawable.createFromPath(source); try { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); }catch (NullPointerException e){ logException(e); } return drawable; } }; 

La "fuente" antes de la prueba es

Http://www.domain.com/images_blog/feature.png

Pero en la captura el error es:

No se puede descodificar el flujo:

 java.io.FileNotFoundException: /http:/www.domain.com/images_blog/feature.png : open failed: ENOENT (No such file or directory) 

3 Solutions collect form web for “Html.ImageGetter TextView”

La solución más fácil es:

 import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import org.pskink.soom.R; 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 TestImageGetter 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.test_image_getter); 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://developer.android.com/assets/images/icon_search.png\">"; Spanned spanned = Html.fromHtml(source, 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); } } } } 

Hay una manera no muy elegante de volver a diseñar un TextView después de la descarga de imágenes:

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

Si alguien sabe mejor solución por favor hágamelo saber

Si tiene mTV (me refiero a TextView), puede calcularlo en función de sus dimensiones (mTv.getWidth () y mTv.getHeight ()) y la dimensión del mapa de bits creado (bitmap.getWidth () y bitmap.getHeight ()) y set Estos valores como nuevas dimensiones de TextView (mTv).

  if (bitmap != null) { BitmapDrawable d = new BitmapDrawable(bitmap); mDrawable.addLevel(1, 1, d); int width = mTv.getWidth() < bitmap.getWidth() ? mTv.getWidth() : bitmap.getWidth(); int height = bitmap.getHeight() * width / bitmap.getWidth(); mDrawable.setBounds(0, 0, width, height); mDrawable.setLevel(1); // i don't know yet a better way to refresh TextView // mTv.invalidate() doesn't work as expected // but we can calculate new TextView dimensions mTv.setHeight(height); CharSequence t = mTv.getText(); mTv.setText(t); } 

Esta respuesta puede ayudar a alguien. Utilicé Jsoup para extraer la etiqueta <Img/> de la cadena y luego mostrar la imagen en ImageView y <p> en Textview . Los resultados fueron de acuerdo a lo que necesitaba. También utilicé el cargador universal de la imagen Libaray para cargar imágenes en ImageView Entonces agregué la visión programmatically a la disposición en mi caso la disposición era linearlayout así que hice una clase del ayudante y el contenido pasado, la cadena del html y la disposición linear como el parámetro.

Agregue jsoup en su proyecto.

 compile 'org.jsoup:jsoup:1.9.2' 

Aquí tiene un fragmento.

 public class PostContentHandler { Context context; String content; LinearLayout linearLayout; public PostContentHandler(Context context, String content, LinearLayout linearLayout) { this.context = context; this.content = content; this.linearLayout = linearLayout; } public void setContentToView() { //custom font Typeface bitterBoldFont = Typeface.createFromAsset(context.getAssets(), "fonts/Bitter-Regular.otf"); List<String> p = new ArrayList<>(); List<String> src = new ArrayList<>(); List<String> li = new ArrayList<>(); Document doc = Jsoup.parse(content); Elements elements = doc.getAllElements(); for (Element element : elements) { Tag tag = element.tag(); if (tag.getName().matches("h[1-6]{1}")) { String heading = element.select(tag.getName().toString()).text(); TextView textView = new TextView(context); textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) textView.getLayoutParams(); int top = (int) context.getResources().getDimension(R.dimen.heading_margin_top); int start = (int) context.getResources().getDimension(R.dimen.content_margin); int end = (int) context.getResources().getDimension(R.dimen.content_margin); params.setMargins(start, top, end, 0); textView.setTextSize(20); textView.setTypeface(bitterBoldFont); textView.setText(heading); textView.setTextColor(context.getResources().getColor(R.color.black)); linearLayout.addView(textView); } if (tag.getName().equalsIgnoreCase("p")) { element.select("img").remove(); String body = element.html(); TextView textView = new TextView(context); textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) textView.getLayoutParams(); int top = (int) context.getResources().getDimension(R.dimen.heading_margin_top); int start = (int) context.getResources().getDimension(R.dimen.content_margin); int end = (int) context.getResources().getDimension(R.dimen.content_margin); params.setMargins(start, top, end, 0); textView.setTypeface(bitterBoldFont); textView.setLinksClickable(true); textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setText(Html.fromHtml(body)); textView.setTextColor(context.getResources().getColor(R.color.content_color)); linearLayout.addView(textView); p.add(body); } if (tag.getName().equalsIgnoreCase("ol")) { String ol = element.select(tag.getName().toString()).outerHtml(); TextView textView = new TextView(context); textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) textView.getLayoutParams(); params.setMarginStart((int) context.getResources().getDimension(R.dimen.content_margin)); int top = (int) context.getResources().getDimension(R.dimen.heading_margin_top); int start = (int) context.getResources().getDimension(R.dimen.content_margin); int end = (int) context.getResources().getDimension(R.dimen.content_margin); params.setMargins(start, top, end, 0); textView.setTypeface(bitterBoldFont); textView.setLinksClickable(true); textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setTextColor(context.getResources().getColor(R.color.content_color)); textView.setText(Html.fromHtml(ol, null, new MyTagHandler())); linearLayout.addView(textView); } if (tag.getName().equalsIgnoreCase("ul")) { String ul = element.select(tag.getName().toString()).outerHtml(); TextView textView = new TextView(context); textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) textView.getLayoutParams(); int top = (int) context.getResources().getDimension(R.dimen.heading_margin_top); int start = (int) context.getResources().getDimension(R.dimen.content_margin); int end = (int) context.getResources().getDimension(R.dimen.content_margin); params.setMargins(start, top, end, 0); textView.setTypeface(bitterBoldFont); textView.setLinksClickable(true); textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setTextColor(context.getResources().getColor(R.color.content_color)); textView.setText(Html.fromHtml(ul, null, new MyTagHandler())); linearLayout.addView(textView); } if (tag.getName().equalsIgnoreCase("img")) { String url = element.select("img").attr("src"); final ImageView imageView = new ImageView(context); imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); final ProgressBar progressBar = new ProgressBar(context); linearLayout.addView(progressBar); progressBar.setVisibility(View.GONE); ImageLoader imageLoader = ImageLoader.getInstance(); imageLoader.displayImage(url, imageView, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); progressBar.setVisibility(View.INVISIBLE); int height = loadedImage.getHeight(); imageView.getLayoutParams().height = getScreenWidth(); imageView.setAdjustViewBounds(true); imageView.requestLayout(); } @Override public void onLoadingStarted(String imageUri, View view) { super.onLoadingStarted(imageUri, view); progressBar.setVisibility(View.VISIBLE); } }); linearLayout.addView(imageView); src.add(url); } } } public static int getScreenWidth() { return Resources.getSystem().getDisplayMetrics().widthPixels; } } 

Espero que mi respuesta ayude a alguien.

  • ¿Puedo desarrollar para Android en algo distinto de Java?
  • Cómo cambiar el tamaño (estiramiento) Android RatingBar sin agregar más estrellas
  • Crear cuadro de lista expandible listview con grupo y niño
  • ¿Por qué utilizar un hashmap?
  • ¿Cómo clonar Joda DateTime?
  • Cómo obtener la ubicación actual en Android
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • Cómo mostrar la selección del primer elemento en la vista de reciclador en android?
  • Android obtiene actividad desde una clase anónima
  • Notificación de Android con RemoteViews: actividad asociada con el diseño de RemoteViews
  • ¿El compilador java optimizará una llamada de método a una variable estática final? ¿Y qué pasa cuando se convierte en código dalvik?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.