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) 

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.

  • Deshacer y rehacer en lienzo para Android
  • Singletons no disponibles cuando la aplicación vuelve a la memoria
  • Excepción de puntero nulo al importar una fuente en android
  • Java mmap falla en Android con "mmap failed: ENOMEM (Fuera de memoria)"
  • ¿Qué cargador de clases usar con Parcel.readHashMap?
  • Cómo probar interfaz de escucha se llama dentro de pruebas de unidad de Android
  • ¿Cómo debo estructurar mi proyecto para compartir clases entre una aplicación cliente de Android y una aplicación de servidor JSP?
  • Android Facebook Graph api información básica que solicita
  • Thrift cliente en Android
  • JSONObject analiza objetos de diccionario
  • ¿Qué significa COLLATE LOCALIZED ASC?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.