混合開(kāi)發(fā)
概述
在Android開(kāi)發(fā)過(guò)程中现柠,我們可能需要做一些模擬操作旁赊,可能需要獲取HTML頁(yè)面的一些信息附鸽,此時(shí)就需要借助重寫(xiě)WebViewClient的onPageFinished方法峰锁,在onPageFinished中加載一段js代碼艇潭,js代碼再調(diào)用本地方法,具體代碼如下:
/**
* Dmeo說(shuō)明: 當(dāng)WebView加載網(wǎng)頁(yè)時(shí)獲取該網(wǎng)頁(yè)中的內(nèi)容.
*/
public class MainActivity extends Activity
{
private WebView mWebView;
String na;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
@SuppressLint("SetJavaScriptEnabled")
private void init() {
mWebView = (WebView) findViewById(R.id.webView);
// 開(kāi)啟JavaScript支持
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");
// 設(shè)置WebView是否支持使用屏幕控件或手勢(shì)進(jìn)行縮放,默認(rèn)是true裆泳,支持縮放
mWebView.getSettings().setSupportZoom(true);
// 設(shè)置WebView是否使用其內(nèi)置的變焦機(jī)制叹洲,該機(jī)制集合屏幕縮放控件使用,默認(rèn)是false工禾,不使用內(nèi)置變焦機(jī)制运提。
mWebView.getSettings().setBuiltInZoomControls(true);
// 設(shè)置是否開(kāi)啟DOM存儲(chǔ)API權(quán)限,默認(rèn)false闻葵,未開(kāi)啟民泵,設(shè)置為true,WebView能夠使用DOM storage API
mWebView.getSettings().setDomStorageEnabled(true);
// 觸摸焦點(diǎn)起作用.如果不設(shè)置槽畔,則在點(diǎn)擊網(wǎng)頁(yè)文本輸入框時(shí)栈妆,不能彈出軟鍵盤(pán)及不響應(yīng)其他的一些事件。
mWebView.requestFocus();
// 設(shè)置此屬性,可任意比例縮放,設(shè)置webview推薦使用的窗口
mWebView.getSettings().setUseWideViewPort(true);
// 設(shè)置webview加載的頁(yè)面的模式,縮放至屏幕的大小
mWebView.getSettings().setLoadWithOverviewMode(true);
// 加載鏈接
mWebView.loadUrl("http://m.qiaocat.com/topic-618_topic/topicIndex");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// 在開(kāi)始加載網(wǎng)頁(yè)時(shí)會(huì)回調(diào)
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 攔截 url 跳轉(zhuǎn),在里邊添加點(diǎn)擊鏈接跳轉(zhuǎn)或者操作
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// 在結(jié)束加載網(wǎng)頁(yè)時(shí)會(huì)回調(diào)
// 獲取頁(yè)面內(nèi)容
view.loadUrl("javascript:window.java_obj.showSource("
+ "document.getElementsByTagName('html')[0].innerHTML);");
// 獲取解析<meta name="share-description" content="獲取到的值">
view.loadUrl("javascript:window.java_obj.showDescription("
+ "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')"
+ ");");
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// 加載錯(cuò)誤的時(shí)候會(huì)回調(diào)厢钧,在其中可做錯(cuò)誤處理鳞尔,比如再請(qǐng)求加載一次,或者提示404的錯(cuò)誤頁(yè)面
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
// 在每一次請(qǐng)求資源時(shí)早直,都會(huì)通過(guò)這個(gè)函數(shù)來(lái)回調(diào)
return super.shouldInterceptRequest(view, request);
}
});
}
public final class InJavaScriptLocalObj
{
@JavascriptInterface
public void showSource(String html) {
System.out.println("====>html=" + html);
}
@JavascriptInterface
public void showDescription(String str) {
System.out.println("====>html=" + str);
}
}
}