ホームページ  >  記事  >  ウェブフロントエンド  >  Android の Textview は HTML テキストを表示します [Textview はローカル画像を表示します]_html/css_WEB-ITnose

Android の Textview は HTML テキストを表示します [Textview はローカル画像を表示します]_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-21 09:10:031555ブラウズ

Textview は基本的な HTML タグを表示できます

そうですね

以下では、「img」タグを表示する Textview に焦点を当てます。おそらく、これを見ると、誰もが ImageGetter を構築し、そのパブリック Drawable getDrawable(String source) メソッドをオーバーロードしてパスを取得することを考えるでしょう。の写真。

例:

<a href="..."><b><big><blockquote><br><cite><dfn><div align="..."><em><font size="..." color="..." face="..."><h1><h2><h3><h4><h5><h6><i><img src="..."><p><small><strike><strong><sub><sup><tt><u>

パブリック Drawable getDrawable(String source) メソッドについて話しましょう。ソースは画像パスです。

例:

final Html.ImageGetter imageGetter = new Html.ImageGetter() {            public Drawable getDrawable(String source) {                    return drawable;    };};

次に、source は img の src の値です。これは次のとおりです: http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg この画像パス

もちろん、これは 0bc2e28e013ae1e280652d10348cce03 image20d45408a8d095e215a93399e1c68d0c

ただし、パスが異なれば、ImageGetter のオーバーロード処理方法も異なります。さまざまな処理方法を 1 つずつ紹介しましょう。

最初の方法: ローカルピクチャ

final String sText = "测试图片信息:<br><img src=\"http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg\" /><img src=\"http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg\" />";tView.setText(Html.fromHtml(sText, imageGetter, null));

2 番目のタイプ: プロジェクト リソースの写真

final String sText2 = "测试图片信息:<img src=\"/mnt/sdcard/temp/1.jpg\" />";tView.setText(Html.fromHtml(sText2, imageGetter, null));final Html.ImageGetter imageGetter = new Html.ImageGetter() {    public Drawable getDrawable(String source) {        Drawable drawable=null;    drawable=Drawable.createFromPath(source);        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    return drawable;  };}

3 番目のタイプ: インターネットの写真

final String sText1 = "测试图片信息:<img src=\""+R.drawable.market_none_image+"\" />";tView.setText(Html.fromHtml(sText1, imageGetter, null));final Html.ImageGetter imageGetter = new Html.ImageGetter() {    public Drawable getDrawable(String source) {        Drawable drawable=null;    int rId=Integer.parseInt(source);    drawable=getResources().getDrawable(rId);    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    return drawable;    };}


、異なる画像パスsrc で必要な画像を img で取得する ImageGetter の処理方法も異なります。

リマインダー: 画像を取得した後、画像の境界を設定する必要があります。つまり、drawable.setBounds(0, 0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight()); しないと、後で Textview を表示できません。画像を取得しています。

上記の 3 つの方法で写真を表示できますが、問題が見つかりました。つまり、3 番目の方法は、写真を表示できる Android2.3 システムを使用しています。大きい、アプリケーションがフリーズする現象は、メインスレッドを使用してネットワークイメージを取得するために発生するはずですが、Android 4.0以降のシステムで実行すると、イメージが表示されず、小さなボックスが表示されるだけです。

その理由は、4.0 システムでの実行時にエラーが報告されたためです。例外は android.os.NetworkOnMainThreadException でした。ドキュメントを確認したところ、4.0 システムではメイン スレッド (UI スレッド) が許可されていないことが判明しました。ネットワークにアクセスするため、例外が発生します。率直に言うと、メイン スレッドでネットワークにアクセスすると、メイン スレッドがハングし、システムによってメイン スレッドの使用が許可されなくなります。

Android 4.0 ではメイン スレッド (UI スレッド) がネットワークにアクセスできないことを見て、すぐにメイン スレッドからアクセスできないのではないかと思いました。別のスレッドを開いて、イメージをローカル SD カードにダウンロードし、次に、それを TextView に割り当てます。急いでコードを読み取らないでください。私も皆さんもこのロジックを実行しています:

画像パスを取得します?? ダウンロード完了後に Textview を再割り当てします


以下はアクティビティですページ処理コード:

final String sText = "测试图片信息:<br><img src=\"http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg\" />";tView.setText(Html.fromHtml(sText, imageGetter, null));final Html.ImageGetter imageGetter = new Html.ImageGetter() {    public Drawable getDrawable(String source) {        Drawable drawable=null;    URL url;    try {        url = new URL(source);        drawable = Drawable.createFromStream(url.openStream(), "");    } catch (Exception e) {        e.printStackTrace();        return null;    }    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());                return drawable;     };}

上記のコードを簡単に紹介します。最も重要なことは、最初に sText を Textview に割り当てることと、Html.ImageGetter のオーバーロード メソッドを使用して画像かどうかを判断することです。ファイルがダウンロードされている場合は、SD カード内のイメージ ファイルを直接読み取るだけです

private TextView tView;    private DownLoadUtils downLoadUtils;    //保存文件路径    private final String path="/mnt/sdcard/downimg";    //设置text的值    String sText = "测试图片信息:<br><img src=\"http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg\" />";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.mxgsa_activity);        findControl();        setData();    }    private void findControl() {        tView = (TextView) findViewById(R.id.tvImage);    }        private void setData() {        //初始化下载类        downLoadUtils=new DownLoadUtils();        //设置下载类监听事件        downLoadUtils.setOnDownloadListener(onDownloadListener);        //给Textview赋值        tView.setText(Html.fromHtml(sText, imageGetter, null));    }    final Html.ImageGetter imageGetter = new Html.ImageGetter() {        public Drawable getDrawable(String source) {            Drawable drawable = null;            String fileString=path+String.valueOf(source.hashCode());            Log.i("DEBUG", fileString+"");            Log.i("DEBUG", source+"");            //判断SD卡里面是否存在图片文件            if (new File(fileString).exists()) {                Log.i("DEBUG", fileString+"  eixts");                //获取本地文件返回Drawable                drawable=Drawable.createFromPath(fileString);                //设置图片边界                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());                return drawable;            }else {                Log.i("DEBUG", fileString+" Do not eixts");                //启动新线程下载                downLoadUtils.download(source, path+String.valueOf(source.hashCode()));                return drawable;            }                    };    };    OnDownloadListener onDownloadListener=new OnDownloadListener() {                //下载进度        public void onDownloadUpdate(DownLoadUtils manager, int percent) {            // TODO Auto-generated method stub            Log.i("DEBUG", percent+"");        }                //下载失败        public void onDownloadError(DownLoadUtils manager, Exception e) {            // TODO Auto-generated method stub                    }                //开始下载        public void onDownloadConnect(DownLoadUtils manager) {            // TODO Auto-generated method stub            Log.i("DEBUG", "Start  //////");        }                //完成下载        public void onDownloadComplete(DownLoadUtils manager, Object result) {            // TODO Auto-generated method stub            Log.i("DEBUG", result.toString());            //替换sTExt的值,就是把图片的网络路径换成本地SD卡图片路径(最早想法,可以不需要这样做了)            //sText.replace(result.toString(), path+String.valueOf(result.hashCode()));            //再一次赋值给Textview            tView.setText(Html.fromHtml(sText, imageGetter, null));        }    };

ダウンロードがない場合は、ダウンロード スレッドを開始します

    //获取本地文件返回Drawable    drawable=Drawable.createFromPath(fileString);                //设置图片边界    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

2 番目の重要なポイントは、ダウンロード完了イベントを監視することです。ダウンロードが完了したら、Textview を再割り当てします

    downLoadUtils.download(source, path+String.valueOf(source.hashCode()));

これを行うと、Textview にネットワーク画像が表示されるようになります。ネットワークが正常な場合は、同じ画像を 1 回ダウンロードするだけで済むため、携帯電話のトラフィックが節約されます。

Textview に値を 2 回割り当てる必要がないソリューションもあります。つまり、最初に画像パスを解析し、次に画像をダウンロードし、最後にそれを Textview に割り当てます。実際、原理は同じです。以前のアプローチでは、オーバーロード メソッドを使用してイメージへのパスを解析し、イメージをダウンロードしていました。これは割り当てが 1 つ増えただけであり、効果はありません。良いアイデアがあれば、ご紹介させていただきます。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。