Html.ImageGetter的TextView [英] Html.ImageGetter TextView
问题描述
因此,使用ImageGetter即时通讯,显示从JSON博客文章的图片。即时得到正确的源日志中,但是当它到达的setBounds的URL改变。任何想法?
code:
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_blog_view);
意向意图= getIntent();
乌里blogUri = intent.getData();
mPost = blogUri.toString();
mUrl = getIntent()getStringExtra(mUrl);
TextView中的TextView =(TextView中)findViewById(R.id.scrollView1);
textView.setText(Html.fromHtml(mPost,imgGetter,NULL));
}
私人ImageGetter imgGetter =新ImageGetter(){
@覆盖
公众可绘制getDrawable(字符串源){
可绘制绘制= Drawable.createFromPath(源);
尝试 {
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
}赶上(NullPointerException异常E){
logException(E);
}
返回绘制;
}
};
在尝试之前,源是
http://www.domain.com/images_blog/feature.png
但在捕获的错误是:
无法去code流:
java.io.FileNotFoundException:/http:/www.domain.com/images_blog/feature.png:打开失败:ENOENT(没有这样的文件或目录)
最简单的解决方法是:
进口java.io.FileNotFoundException;
进口java.io.IOException异常;
进口的java.io.InputStream;
进口java.net.MalformedURLException;
进口的java.net.URL;
进口org.pskink.soom.R;
进口android.app.Activity;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.drawable.BitmapDrawable;
进口android.graphics.drawable.Drawable;
进口android.graphics.drawable.LevelListDrawable;
进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.text.Html;
进口android.text.Html.ImageGetter;
进口android.text.Spanned;
进口android.util.Log;
进口android.widget.TextView;
公共类TestImageGetter扩展活动实现ImageGetter {
私人最终静态字符串变量=TestImageGetter;
私人TextView的MTV;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.test_image_getter);
字符串源=这是℃的测试; B> ImageGetter< / B>其包含+
两个图像:其中; BR />中+
&所述; IMG SRC = \的http://developer.android.com/assets/images/dac_logo.png \>&所述峰; br />和&所述峰; br />中+
&所述; IMG SRC = \的http://developer.android.com/assets/images/icon_search.png \>中;
跨区跨区= Html.fromHtml(源,这一点,NULL);
MTV =(TextView中)findViewById(R.id.text);
mTv.setText(跨越);
}
@覆盖
公众可绘制getDrawable(字符串源){
LevelListDrawable D =新LevelListDrawable();
绘制对象空= getResources()getDrawable(R.drawable.ic_launcher)。
d.addLevel(0,0,空);
d.setBounds(0,0,empty.getIntrinsicWidth(),empty.getIntrinsicHeight());
新的LoadImage()执行(源,D)。
返回D组;
}
一流的LoadImage扩展的AsyncTask<对象,太虚,位图> {
私人LevelListDrawable mDrawable;
@覆盖
受保护的位图doInBackground(对象... PARAMS){
字符串源=(字符串)PARAMS [0];
mDrawable =(LevelListDrawable)PARAMS [1];
Log.d(TAG,doInBackground+源);
尝试 {
InputStream的是=新的URL(源).openStream();
返回BitmapFactory.de codeStream(是);
}赶上(FileNotFoundException异常E){
e.printStackTrace();
}赶上(MalformedURLException异常E){
e.printStackTrace();
}赶上(IOException异常E){
e.printStackTrace();
}
返回null;
}
@覆盖
保护无效onPostExecute(位图位图){
Log.d(TAG,onPostExecute绘制+ mDrawable);
Log.d(TAG,onPostExecute位图+位);
如果(位图!= NULL){
BitmapDrawable D =新BitmapDrawable(位);
mDrawable.addLevel(1,1,四);
mDrawable.setBounds(0,0,bitmap.getWidth(),bitmap.getHeight());
mDrawable.setLevel(1);
//我还不知道一个更好的方式来刷新的TextView
//如预期mTv.invalidate()不工作
CharSequence的T = mTv.getText();
mTv.setText(T);
}
}
}
}
还有一个不太优雅的方式来重新布局图像下载后一个TextView:
//我还不知道一个更好的方式来刷新的TextView
//如预期mTv.invalidate()不工作
CharSequence的T = mTv.getText();
mTv.setText(T);
如果有人知道更好的解决方案,请让我知道
So Im using ImageGetter to display the images from JSON blog posts. Im getting the correct source in the log but the URL changes when it reaches setBounds. Any ideas?
Code:
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;
}
};
The "source" before the try is
http://www.domain.com/images_blog/feature.png
but in the catch the error is:
Unable to decode stream:
java.io.FileNotFoundException: /http:/www.domain.com/images_blog/feature.png : open failed: ENOENT (No such file or directory)
the easiest solution is:
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);
}
}
}
}
there is one not quite elegant way to re-layout a TextView after image downloading:
// 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);
if anybody knows better solution please let me know
这篇关于Html.ImageGetter的TextView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!