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:
- Cómo mostrar sólo el mes actual en la vista de calendario de Android
- ¿Cómo puedo acelerar el análisis XML de Android?
- Cómo comprobar si un hilo de Android está en ejecución
- Conjunto de datos para almacenar objetos en java
- ¿Cómo puedo manejar los cambios de orientación de la pantalla cuando un diálogo está abierto?
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)
- ¿Cómo eliminar el permiso específico al crear una aplicación para Android con gradle?
- Reutilizar conexiones TCP con HttpsUrlConnection
- Obtener el número de aplicaciones instaladas en un dispositivo Android?
- ¿Cómo podemos crear un gráfico de las dependencias de Dagger 2?
- Problemas al recibir ACTION_PASSWORD_SUCCEEDED y ACTION_PASSWORD_FAILED intents
- ¿Cómo especificar el tamaño correcto del diálogo en el archivo de disposición XML para el diálogo de Android?
- Dagger 2 dependencias de componentes
- Fuente impresionante en la vista de lista de Android no funciona
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.
- ¿Los comentarios afectan el tiempo de compilación?
- Error al intentar probar AnimatedVectorDrawable, "No se puede cambiar de x a z"