Android ImageGetter图像重叠文本

我正在尝试将一块HTML加载到TextView中,包括图像,使用

URLImageParser p = new URLImageParser(articleBody, this); Spanned htmlSpan = Html.fromHtml(parsedString, p, null); 

顺便说一句,parsedString是HTML。 无论如何,它加载,但图像没有为他们创建任何空间,所以他们最终重叠他们上面的文本。 这是我的URLImageParser文件:

 public class URLImageParser implements Html.ImageGetter { Context c; View container; /*** * Construct the URLImageParser which will execute AsyncTask and refresh the container * @param t * @param c */ public URLImageParser(View t, Context c) { this.c = c; this.container = t; } public Drawable getDrawable(String source) { URLDrawable urlDrawable = new URLDrawable(); // get the actual source ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask( urlDrawable); asyncTask.execute(source); // return reference to URLDrawable where I will change with actual image from // the src tag return urlDrawable; } public class ImageGetterAsyncTask extends AsyncTask { URLDrawable urlDrawable; public ImageGetterAsyncTask(URLDrawable d) { this.urlDrawable = d; } @Override protected Drawable doInBackground(String... params) { String source = params[0]; return fetchDrawable(source); } @Override protected void onPostExecute(Drawable result) { // set the correct bound according to the result from HTTP call Log.d("height",""+result.getIntrinsicHeight()); Log.d("width",""+result.getIntrinsicWidth()); urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight()); // change the reference of the current drawable to the result // from the HTTP call urlDrawable.drawable = result; // redraw the image by invalidating the container URLImageParser.this.container.invalidate(); } /*** * Get the Drawable from URL * @param urlString * @return */ public Drawable fetchDrawable(String urlString) { try { URL aURL = new URL(urlString); final URLConnection conn = aURL.openConnection(); conn.connect(); final BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); final Bitmap bm = BitmapFactory.decodeStream(bis); Drawable drawable = new BitmapDrawable(bm); drawable.setBounds(0,0,bm.getWidth(),bm.getHeight()); return drawable; } catch (Exception e) { return null; } } } 

}

有任何想法吗? 万分感谢。

Related of "Android ImageGetter图像重叠文本"

是否有特殊原因需要将其加载到文本视图中? 你可以改用WebView吗?

如果您无法使用Webview,那么最佳解决方案是不将图像放在文本视图中。 将图像放在ImageView中。 TextViews没有任何布局引擎function,您需要确定将图像和文本相互关联的位置。 它们不是ViewGroups(如LinearLayout或RelativeLayout),因此没有内部布局指定function。 如果你真的不想使用webview(以及它所拥有的所有漂亮的布局引擎),你将不得不弄清楚如何自己安排单独的TextViews和ImageViews。

您可以将您的投币器c(视图)更改为textView,然后使您的onPostExecute看起来像这样:

 @Override protected void onPostExecute(Drawable result) { // set the correct bound according to the result from HTTP call Log.d("height",""+result.getIntrinsicHeight()); Log.d("width",""+result.getIntrinsicWidth()); urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight()); // change the reference of the current drawable to the result // from the HTTP call urlDrawable.drawable = result; // redraw the image by invalidating the container URLImageParser.this.container.invalidate(); // For ICS URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() + result.getIntrinsicHeight())); // Pre ICS URLImageParser.this.textView.setEllipsize(null); } 

这将首先绘制图像,然后立即将TextView的高度设置为drawable的高度+ TextViews高度

我没有足够的声誉来为Martin S投票,但他的回答非常有用。如果TextView在加载之前显示了默认图像,我们可以像这样更改setHeight()方法:

  URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() + result.getIntrinsicHeight()-mDefaultDrawable.getInstrinsicHeight())); 

可能我们不需要将容器从View更改为TextView。

  @Override protected void onPostExecute(Drawable result) { // set the correct bound according to the result from HTTP call urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight()); // change the reference of the current drawable to the result // from the HTTP call urlDrawable.drawable = result; // redraw the image by invalidating the container URLImageParser.this.container.setMinimumHeight((URLImageParser.this.container.getHeight()+ result.getIntrinsicHeight())); URLImageParser.this.container.requestLayout(); URLImageParser.this.container.invalidate(); } 

我发现这些解决方案有一个有趣的行为:如果图像的加载速度很快且文本视图尚未渲染(例如我使用Okhttp进行缓存,那么第二次调用非常快),textview大小为0。

为了解决这个问题,我将ImageGetter从AsyncTask转换回来,然后启动AsyncTask,为我的TextView创建Spanned并在之后设置文本。

使用此解决方案,每次加载图像时都不需要调整TextView的大小。

 new AsyncTask() { TextView tv; @Override protected Spanned doInBackground(TextView... params) { tv = params[0]; return Html.fromHtml(feedEntry.getContent(), new HttpImageGetter(getActivity(), HttpLoaderImpl.getInstance(getActivity())), new Html.TagHandler() { @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { //do nothing... } }); } @Override protected void onPostExecute(final Spanned result) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { tv.setText(result); } }); } }.execute(textView);