WebView最簡單的用法就是loadUrl方法.
常用代碼如下.
demoWv = ((WebView) findViewById(R.id.demoWv));
WebSettings settings = demoWv.getSettings();
// 網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
settings.setJavaScriptEnabled(true);
demoWv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// 是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
return true;
}
});
demoWv.loadUrl("https://www.baidu.com");
WebView攔截請求
WebView調(diào)用loadUrl后,會首先根據(jù)傳入U(xiǎn)RL獲取響應(yīng),然后再將響應(yīng)顯示到頁面上,這就是WebView的原理.根據(jù)這個(gè)原理,那么我們可以在獲取響應(yīng)過程中重新改變請求URL或者直接將響應(yīng)替換.
而具體的替換在WebViewClient的:
WebResourceResponse shouldInterceptRequest(
WebView view,WebResourceRequest request
)
這個(gè)方法中,該方法用于根據(jù)請求去獲取響應(yīng),如果返回null,那么android會根據(jù)請求去獲取響應(yīng)并返回,但是如果你重寫了該方法并返回了響應(yīng),那么WebView就會使用你的響應(yīng)數(shù)據(jù).其中WebResourceRequest封裝了請求,WebResourceResponse封裝了響應(yīng).
使用靜態(tài)響應(yīng)
既然知道了原理,就可以寫個(gè)demo測試一下
demoWv = ((WebView) findViewById(R.id.demoWv));
WebSettings settings = demoWv.getSettings();
// 網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
settings.setJavaScriptEnabled(true);
demoWv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// 是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String result = "<html>\n" +
"<title>千度</title>\n" +
"<body>\n" +
"<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +
"</body>\n" +
"<html>";
WebResourceResponse response = new WebResourceResponse("text/html",
"utf-8",
new ByteArrayInputStream(result.getBytes()));
return response;
}
});
demoWv.loadUrl("https://www.baidu.com");
使用網(wǎng)絡(luò)資源響應(yīng)
shouldInterceptRequest方法API還有介紹,該方法是在非UI線程中,所以當(dāng)需要與View系統(tǒng)交互時(shí)需要小心.既然時(shí)非UI線程中,那么我們可以放在其中做網(wǎng)絡(luò)請求.比如可以可以去www.importnew.com的響應(yīng)數(shù)據(jù),將百度替換為importnew.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
demoWv = ((WebView) findViewById(R.id.demoWv));
WebSettings settings = demoWv.getSettings();
// 網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
settings.setJavaScriptEnabled(true);
demoWv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// 是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return getWebRes();
}
});
demoWv.loadUrl("https://www.baidu.com");
}
private WebResourceResponse getWebRes() {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
URL url = new URL("http://www.importnew.com/");
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// 連接主機(jī)超時(shí)時(shí)間
httpURLConnection.setConnectTimeout(10 * 1000);
// 設(shè)置從主機(jī)讀取數(shù)據(jù)超時(shí)
httpURLConnection.setReadTimeout(40 * 1000);
bufferedReader = new BufferedReader(new
InputStreamReader(httpURLConnection
.getInputStream()));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (bufferedReader!=null){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
WebResourceResponse webResourceResponse = null;
webResourceResponse=new WebResourceResponse("text/html",
"utf-8",
new ByteArrayInputStream(stringBuilder.toString().getBytes()));
return webResourceResponse;
}
注意:WebView中調(diào)用的每個(gè)請求都會經(jīng)過那個(gè)攔截器,所以如果一個(gè)頁面中又有超鏈接,那么依然會經(jīng)過那么攔截器.所以上面的Importnew中有些圖片沒有加載出來.因?yàn)槭且晕谋拘问巾憫?yīng)的,并且是以utf-8做為編碼的,所以有時(shí)候會出現(xiàn)亂碼.
應(yīng)用
在實(shí)際應(yīng)用中,最好時(shí)先判斷要加載的URL是否需要攔截,如果不是的話,可以以然交給WebView去實(shí)現(xiàn).