Html.ImageGetter的TextView [英] Html.ImageGetter TextView

查看:138
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆