我正在尝试使用
将一块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<String, Void, Drawable> {
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;
}
}
}
}
有什么想法吗?非常感谢。
答案 0 :(得分:52)
您可以将您的投币器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高度
答案 1 :(得分:2)
我没有足够的声誉为Martin S投票,但他的回答非常有帮助。如果TextView在加载之前显示了默认图像,我们可以像这样更改setHeight()方法:
URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()
+ result.getIntrinsicHeight()-mDefaultDrawable.getInstrinsicHeight()));
答案 2 :(得分:0)
可能我们不需要将容器从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();
}
答案 3 :(得分:0)
我发现这些解决方案有一个有趣的行为: 如果图像加载速度很快且文本视图尚未渲染(例如我使用Okhttp进行缓存,那么第二次调用非常快),textview大小为0.
要解决此问题,我已将ImageGetter从AsyncTask转换回来,而是启动AsyncTask,为我的TextView创建Spanned并在之后设置文本。
使用此解决方案,每次加载图像时都不需要调整TextView的大小。
new AsyncTask<TextView, Void, Spanned>() {
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);
答案 4 :(得分:-2)
您是否需要将其加载到文本视图中?你可以改用WebView吗?
如果您无法使用Webview,那么最佳解决方案是不将图像放在文本视图中。将图像放在ImageView中。 TextViews没有任何布局引擎功能,您需要确定将图像和文本相互关联的位置。它们不是ViewGroups(如LinearLayout或RelativeLayout),因此没有内部布局指定功能。如果你真的不想使用webview(以及它拥有的所有漂亮的布局引擎),你将不得不弄清楚如何自己安排单独的TextViews和ImageViews。