編輯:關於Android編程
最近做的項目中,遇到個很棘手的問題:
客戶給我的數據是有限制的,因此,在返回某條具體頁面內容的時候,他只能給我一個html片段,裡面包含
文字,圖片以及附件的下載地址。如果網頁模版規范的愛比較好說,但是他給我的數據中,不確定的因素很多:
比如 可能沒有圖片,圖片和文字穿插在一起,最為重要的是html便簽他的嵌套層次和標簽個數都是不確定的。
如果我采用解析html提取內容出來的話,估計就掉進坑裡了.......
但實際情況中,打算服務器先將客戶代碼的標簽屬性刪除,只剩骨頭,但結果還是不盡人意,因為將所有原本的標簽屬性刪除後,顯示還是會有問題........。。。
因此,我看了一下網易新聞等感覺都是采用webview進行展示的,關鍵是如何封裝並處理好數據了。
學走路,還是從模仿開始。這裡借鑒了大牛們的博客,經驗,再次一並謝過:
http://blog.csdn.net/zi413293813/article/details/18144055
http://blog.csdn.net/kavensu/article/details/7931480
http://blog.csdn.net/wangtingshuai/article/details/8635787
http://blog.csdn.net/chenshijun0101/article/details/7045394
我的需求:下載圖片;下載附件、
采用思路:將內容用html展示,並且實現java和js的交互,響應用戶點擊圖片的動作。
這裡我寫了一個demo,按照上面別人的例子簡單封裝了一下,當然,這裡只是提供一種思路,具體怎麼封裝怎麼去實現更好好還是的要具體問題具體分析了。
別忘了:添加寫文件權限和網絡權限
demo使用測試頁面:http://www.cnbeta.com/articles/292267.htm<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20140518/2014051809282237.jpg" alt="\">
這裡,因為他的內容太多,所以我直接去了主要內容部分,也就是有我文字和圖片混搭的部分。
接口:主要用於回調,當然為了擴展的話,還可以添加更多方法。
package com.example.androidwebviewdemo; /** **
* 下午8:04:06 * * @auther xiangxm */ public interface IOnWebViewCallBack { /** ** 頁面加載進度 *
* * @param progress * void */ void onProgressChanged(int progress); }
private void initView() { progressbar = (ProgressBar) findViewById(R.id.progressbar); progressbar.setVisibility(View.INVISIBLE); mWebView = (WebView) findViewById(R.id.webview_ui); WebSettings settings = mWebView.getSettings(); // 設置webview的相關屬性 settings.setJavaScriptEnabled(true);// 允許執行js代碼 settings.setBlockNetworkImage(true); settings.setSupportZoom(false);// 不支持縮放 settings.setBuiltInZoomControls(false);// 內置縮放 settings.setPluginsEnabled(true); settings.setDefaultTextEncodingName("UTF-8");// 設置默認編碼 mWebView.getSettings() .setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);// 禁止由於內容過寬,導致橫屏滾動。 mWebView.addJavascriptInterface(new JavaScriptInterface(), HtmlParser.Js2JavaInterfaceName); HtmlParser htmlParser = new HtmlParser(mWebView, "http://www.cnbeta.com/articles/292267.htm", this, this); htmlParser.execute(); }
直接上代碼:HtmlParser
package com.example.androidwebviewdemo; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.content.Context; import android.graphics.Bitmap; import android.os.AsyncTask; import android.util.Log; import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; /** ** html處理的相關類:給圖片添加onClick屬性。,過濾a標簽,添加屬性等。、 *
* 下午6:40:37 * * @auther xiangxm */ public class HtmlParser extends AsyncTask{ public static String Js2JavaInterfaceName = "JsUseJava"; private WebView mWebView; /** 網頁地址 **/ private String htmlUrl = ""; private Context mContext; /** 存儲img標簽圖片地址。 **/ private List imageUrlList = new ArrayList (); public List getImagerUrlList() { return imageUrlList; } public HtmlParser(WebView wevView, String url, Context context, IOnWebViewCallBack onWebViewCallBack) { this.mWebView = wevView; htmlUrl = url; mContext = context; this.onWebViewCallBack = onWebViewCallBack; configWebView(); } /** * * 配置WebView的相關信息 *
* void */ private void configWebView() { // mWebView.setWebViewClient(new MyWebClient()); mWebView.setWebChromeClient(new MyWebChrome()); } class MyWebClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mWebView.getSettings().setBlockNetworkImage(false);// 關閉圖片阻塞 // 頁面加載完成之後,更換圖片顯示,異步更換圖片顯示。 DownloadWebImgTask downloadTask = new DownloadWebImgTask(mWebView); ListurlStrs = imageUrlList; String urlStrArray[] = new String[urlStrs.size() + 1]; urlStrs.toArray(urlStrArray); downloadTask.execute(urlStrArray); if (null != onWebViewCallBack) { onWebViewCallBack.onProgressChanged(View.INVISIBLE); } } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 當連接被點擊的時候希望覆蓋而不是打開新的窗口 // view.loadUrl(url); return true; } } class MyWebChrome extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); // 加載的時候顯示進度可以在這裡添加 if (null != onWebViewCallBack) { // 加載顯示進度的時候 // onWebViewCallBack.onProgressChanged(newProgress); } } } private IOnWebViewCallBack onWebViewCallBack; public void setOnWebViewCallBack(IOnWebViewCallBack onWebViewCallBack) { this.onWebViewCallBack = onWebViewCallBack; } /** * * 注入js代碼,添加Onclick事件 *
* * @param doc * void */ public void handleImageClickEvent(Document doc) { Elements es = doc.getElementsByTag("img"); for (Element e : es) { String imgUrl = e.attr("src"); imageUrlList.add(imgUrl); String imgName; File file = new File(imgUrl); imgName = file.getName(); if (imgName.endsWith(".gif")) { e.remove(); } else { String filePath = "file:///mnt/sdcard/test/" + imgName; e.attr("src", "file:///android_asset/ic_launcher.png"); e.attr("src_link", filePath); e.attr("ori_link", imgUrl); String str = "window." + Js2JavaInterfaceName + ".setImgSrc('" + filePath + "')"; e.attr("onclick", str); } } } /** ** 與java交互 將a超鏈接標簽,點擊後提供下載 *
* * @param doc * void */ private void handleHyperlinks(Document doc) { Elements hrefs = doc.getElementsByTag("a"); for (Element href : hrefs) { String str = "window." + Js2JavaInterfaceName + ".onClick_Tag_A('" + href.attr("href") + "')"; href.attr("onclick", str); } } @Override protected String doInBackground(Void... params) { if (null != onWebViewCallBack) { onWebViewCallBack.onProgressChanged(View.VISIBLE); } Document doc = null; imageUrlList.clear(); try { doc = Jsoup.parse(new URL(htmlUrl), 15000); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } if (doc == null) return null; Elements es = doc.select("script"); if (es != null) { es.remove(); } Document docNew = Jsoup.parse(doc.getElementsByClass("article_content") .html()); handleImageClickEvent(docNew); handleHyperlinks(docNew); Log.i("-------->html內容", docNew.toString()); return docNew.toString(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); mWebView.loadDataWithBaseURL(null, result, "text/html", "utf-8", null);// 這樣展示可以有效放置中文亂碼 super.onPostExecute(result); } }
當點擊了圖片之後:通常情況下會跳轉到浏覽器新頁面覆蓋。這裡實現需求是,點擊圖片不跳轉,直接將WebViewClient的shouldOverrideUrlLoading return true;將事件消費掉就OK。
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 當連接被點擊的時候希望覆蓋而不是打開新的窗口 // view.loadUrl(url); return true; }
demo顯示內容的時候有點慢。
源代碼下載地址:http://download.csdn.net/detail/xxm282828/7362539
隨著現在手機硬件不斷的提升,分辨率提高手機的安裝包也是越來越大了。當年NOKIA,MOTO時代,一個手機APP如果有1MB那都是算大的,2MB已經不得了了。雖然網
由於手機屏幕的高度有限,所以如果面對組件要顯示多組信息的時候,ScrollView視圖(滾動視圖)可以有效的安排這些組件,浏覽時可以自動的進行滾屏的操作。 android
最近剛換了電腦,開始搭建Android開發環境的時候,下載SDK總是會出現如下錯誤:復制代碼 代碼如下:Failed to fetch URL http://dl-ssl
不知不覺這個春節也已經過完了,遺憾家裡沒網,沒能及時給大家送上祝福,今天回到深圳,明天就要上班了,小伙伴們是不是和我一樣呢?今天講的是一個大家都見過的動畫,雷達搜索好友嘛