1. 程式人生 > >Android開發技巧——TextView載入HTML的圖片及程式碼顯示問題

Android開發技巧——TextView載入HTML的圖片及程式碼顯示問題

前幾天在做一個Gradle使用者指南的應用程式,使用的是TextView來載入HTML內容(至於為什麼不用WebView,我也沒有認真使用並比較過,也許以後會換吧),其中遇見了一些糾結的問題,所幸主要的問題都一一解決了。

下面說一下遇見的幾個問題及我的解決方法。

TextView非同步載入HTML中的圖片及圖文重疊

在TextView中載入HTML圖片,需要實現Html.ImageGetter介面,然後在public Drawable getDrawable(String source)中去獲取圖片。圖片獲取我是直接使用了ImageLoader,一來載入圖片省事,二來帶快取功能,正是我想要的。但是getDrawable方法是在主執行緒中呼叫的,且要求返回Drawable物件用於顯示,而我們是不能在主執行緒中進行網路訪問的,所以需要非同步載入。ImageLoader本身已經有非同步載入的功能,所以我們需要將它與getDrawable方法結合起來。這裡用的方法與百度上常見到的方法略有不同,因為百度上的方法在我這裡會有BUG,在第二次進入時圖片經常載入不出來。

首先,寫一個類繼承BitmapDrawable,程式碼如下:

package com.githang.gradledoc.chapter;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;

/**
 * User: Geek_Soledad([email protected])
 * Date: 2014-11-30
 * Time: 00:09
 * FIXME
 */
public class URLDrawable extends BitmapDrawable {
    protected Bitmap bitmap;

    @Override
    public void draw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, getPaint());
        }
    }
}

這個類用於在getDrawable中返回的物件。

然後寫一個類實現Html.ImageGetter介面,程式碼如下:

    public class URLImageParser implements Html.ImageGetter {
        TextView mTextView;

        public URLImageParser(TextView textView) {
            this.mTextView = textView;
        }

        @Override
        public Drawable getDrawable(String source) {
            final URLDrawable urlDrawable = new URLDrawable();
            Log.d("ChapterActivity", Consts.BASE_URL + source);
            ImageLoader.getInstance().loadImage(Consts.BASE_URL + source, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    urlDrawable.bitmap = loadedImage;
                    urlDrawable.setBounds(0, 0, loadedImage.getWidth(), loadedImage.getHeight());
                    mTextView.invalidate();
                    mTextView.setText(mTextView.getText()); // 解決圖文重疊
                }
            });
            return urlDrawable;
        }
    }
這裡的mTextView是我們要載入圖片的TextView物件。這裡我暫未對圖片做自適應螢幕的適配,做的比較簡單,只是把載入後的圖片設定到之前返回的URLDrawable物件中的urlDrawable去,然後呼叫mTextView.invalidate()方法更新介面。

但是這樣寫完之後,還有一個問題。儘管我們對urlDrawable呼叫了setBounds設定它的邊框,但是還是會出現圖片重疊的問題。需要重新設定一下mTextView的內容,如上面程式碼中的:

mTextView.setText(mTextView.getText());

設定HTML到TextView的程式碼如下:

mDocView.setText(Html.fromHtml(doc, new URLImageParser(mDocView), null));

顯示的程式碼格式全亂

TextView雖然可以顯示html,但許多標籤並不能支援。比如用於顯示程式碼的<pre>,<code>這些標籤。原本以為TagHandler可以解決這個問題,但是我在看了網上對TagHandler的用法介紹之後,發現這種用法並不能處理我遇見的這個問題,因為它只能處理解析到的標籤之前的內容,無法處理標籤之後的內容。好在我在設定HTML的內容到TextView之前是有用jsoup進行一些處理的,於是決定用jsoup進行處理。 處理方法很簡單,對<pre>裡的標籤,把換行符替換成<br/>,把空格替換成&nbsp;,程式碼如下:
    /**
     * 處理程式碼顯示問題.
     *
     * @param chapter 章節內容的html元素。
     */
    private void handlerPreTag(Element chapter) {
        Elements preElems = chapter.select("pre");
        for (Element elem : preElems) {
            elem.html(elem.html().replaceAll("\n", "<br/>").replaceAll(" ", " "));
        }
    }

最後上兩張解決這個問題後的效果圖:
本文原創,轉載請註明出處:http://blog.csdn.net/maosidiaoxian/article/details/41673425

相關推薦

Android開發技巧——TextView載入HTML圖片程式碼顯示問題

前幾天在做一個Gradle使用者指南的應用程式,使用的是TextView來載入HTML內容(至於為什麼不用WebView,我也沒有認真使用並比較過,也許以後會換吧),其中遇見了一些糾結的問題,所幸主要的問題都一一解決了。 下面說一下遇見的幾個問題及我的解決方法。 TextV

Android TextView載入html圖片詳解

       學Android的時候突然想到一個問題:怎麼用TextView控制元件顯示帶有格式的文字,可否使用Html佈局?查了下Android 幫助文件,其提供了android.text.Html類和Html.ImageGetter、Html.TagHandler介

android-Picasso請求https載入網路圖片不能顯示的解決方案

Picasso載入https的圖片載入不出來的解決方案 最近專案中有需求–要顯示https連結的圖片,但是配置好路徑後原生的Picasso死活沒法加載出圖片,最後在網上找到了如下的解決辦法 確認依賴 compile 'com.squareup.ok

android TextView 載入html 顯示圖片並且新增img標籤點選事件工具類 富文字 圖文混排 圖片大小調整

注意,本人部落格主要是為了自己記錄,如果有問題歡迎反饋哈。 android的TextView可以載入html程式碼,並且識別他們的標籤,用的方法就是setText(Html.fromHtml(source)),其中source是指定的字串,包含html標籤,用setText

android textView 載入HTML 非同步載入網路圖片

/** * 重寫圖片載入介面 * * @author Ruffian * @date 2016年1月15日 * */ class HtmlImageGetter implements Html.ImageGetter { /** * 獲取圖片 */ @Ov

Android開發技巧——定製仿微信圖片裁剪控制元件

拍照——裁剪,或者是選擇圖片——裁剪,是我們設定頭像或上傳圖片時經常需要的一組操作。上篇講了Camera的使用,這篇講一下我對圖片裁剪的實現。 背景 下面的需求都來自產品。 裁剪圖片要像微信那樣,拖動和放大的是圖片,裁剪框不動。 裁剪框外的內容要有半透

Android開發技巧——去掉TextView中autolink的下劃線

我們知道,在佈局檔案中設定textview的autolink及其型別,這時textivew上會顯示link的顏色,並且文字下面會有一條下劃線,表示可以點選。而在我們在點選textview時,應用將根據我們所設定的型別跳轉到對應的介面。但是有時,我們因介面需求,需要去掉介面上

android webview載入html圖片自適應手機螢幕大小&點選檢視大圖

我們在開發中,顯示資訊詳情時,一般後臺會給出html文字,在Android端一般採用webview控制元件來展示,但是後臺給出的html文字一般是給電腦端用的,沒有自適配手機,導致手機端圖片顯示過大,需要左右移動來檢視全圖。下面給出幾種實用方法,達到在手機端用webvi

【iOS開發】UIWebView載入html時不顯示網路圖片解決辦法

NSString *html = @"<html><body><p>怎麼顯示網路圖片 <img src=\"http://p0.ifengimg.com/pmop/2017/1218/F9636BB16CC72EC34B5FCB78

iOS開發——WebView載入HTML圖片大小自適應與文章自動換行

本文主要講述瞭如何在iOS應用中使用WebView載入HTML圖片時實現自適應與文章自動換行功能,現在把相關的實現思路和程式碼整理出來分享給iOS程式設計師兄弟們,希望給他們的開發工作帶來幫助。 在很多App中都會使用到webview,尤其是在載入新聞內容等文章形式的資

混合開發之webView載入html,androidhtml之間進行資料互動

現在混合開發比較普遍了,其實早就該學學了,只限於自己對html不是很熟,搭的介面太醜了,哈哈… 今天寫Demo的需求是這樣的 1、在一個介面裡,半面html,半面android原生控制元件。 2、點選html傳送html的資料給android ,andro

TextView載入 html 程式碼,藉助Glide載入jpg or gif 等圖片格式

app載入網頁資料,可能大部分人都習慣用WebView去實現,簡單方便,但是有些時候從api返回的html資料中,是不帶html 的css樣式的,這時候html 加載出來的文字會顯示不整潔,達不到自己想要的效果,甚至文字很小,如果用WebView去顯示的話,使用

Android 獲取手機模擬器sd卡圖片擷取圖片

需把圖片儲存到找到手機模擬器(夜神模擬器)sd卡中的圖片路徑:檔案管理器/mnt/sdcard/images(images是自己創的資料夾) java程式碼: package com.example.android_07; import android.graphics.Bitmap

Android之Volley框架載入網路圖片

更多幹貨 分散式實戰(乾貨) spring cloud 實戰(乾貨) mybatis 實戰(乾貨) spring boot 實戰(乾貨) React 入門實戰(乾貨) 構建中小型網際網路企業架構(乾貨) python 學習持續更

Android開發技巧之:QQ第三方登入(二)

接 android QQ第三方登入(一)  獲取登入使用者名稱資訊,這邊先抱怨一下,官方API有點坑 Constants原始碼類下就是找不到GRAPH_SIMPLE_USER_INFO這個屬性!無語! 根據官方提供返回的的JSONObject資訊解析:

Android開發技巧之:QQ第三方登入(一)

使用的是Android_SDK_V2.9.1,建議使用最新版; 官方下載:SDK下載  Android studio 中新增到 然後在點選build.gradle檔案新增 配置AndroidManifest 在應用的Andr

Android開發技巧不同狀態的Button

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android開發技巧(一):程式碼日誌跟蹤後臺顯示Log.i();

1.Activity中使用Log.i(); private static final String TAG = “GoodsSourceActivity”;//定義常量標記 Log.i(TAG,”—–TEST-BUNDLE——-“+uuid);//日誌列印,i級別 2.Fragme

Fresco 在Android 4.4 版本 載入https圖片問題 javax.net.ssl.SSLHandshakeException

由於Android系統的不同版本支援的TLS 版本不同,導致Fresco 載入https圖片(圖片來源於不同伺服器,並且配置不一樣)出現SSLHandshakeException TLS 用於在兩個通訊應用程式之間提供保密性和資料完整性。TLS 1.0可以理解成

Android開發技巧之xml tools屬性詳解

我們知道,在 Android 開發過程中,我們的資料常常來自於服務端,只有在執行時才能獲得資料展示,因此在佈局 XML 的編寫過程中,由於缺少資料,我們很難直接看到填充資料後的佈局效果,那這個時候你一般是怎麼做的呢? 經常看到一些小夥伴的做法是在佈局檔案中臨時