Android之WebView
WebView恐怕是每个Android工程师用得最多的控件之一,它可以加载多种形式的网络页面。这无疑也是Android的核心功能之一。
一个最简单的WebView使用代码如下,
layout/activity_web_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<WebView
android:id="@+id/wv_main1"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
WebViewActivity
package com.spacesoftwares.myapplication3;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class WebViewActivity extends AppCompatActivity {
private WebView mWvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWvMain = findViewById(R.id.wv_main1);
mWvMain.loadUrl("file:android_asset/test.html");
}
}
要注意的问题1
这里要特别注意的是,通常文件夹是通过下面的方式添加的,
此时,Android Studio会自动配置build.gradle(module app),添加相应的代码,如下,
(我的文件夹路径:D:\AndroidStudioProjects\MyApplication3\app\src\main\assets)
apply plugin: 'com.android.application'
android {
。。。。。。
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}
如果你是通过手动建议的文件夹,请务必将相应的位置信息在gradle中设置好。
要注意的问题2
不知从什么时候起,Android Studio的Url需要四个“/”,你可能已经注意到mWvMain.loadUrl("file:android_asset/test.html");这里file:使用了4个反斜杠。否则的话,你可能会得到ERR_FILE_NOT_FOUND这样的警告,
最后,给个最终的显示结果吧,我的HTML代码如下,
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<p>
This is a section of test message!!
</p>
</body>
</html>
显示如下
当然WebView还有不少支持功能,比如setWebViewClient,他主要处理各种通知、请求事件;setWebChromeClient则主要负责处理JavaScript的对话框,网站图标,网站title,加载进度等。
下面这个详实的例子,演示了如何使用这些功能
package com.spacesoftwares.myapplication3;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class WebViewActivity extends AppCompatActivity {
private WebView mWvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWvMain = findViewById(R.id.wv_main1);
mWvMain.getSettings().setJavaScriptEnabled(true);
mWvMain.setWebViewClient(new MyWebViewClient());
mWvMain.setWebChromeClient(new MyWebChromeClient());
mWvMain.loadUrl("https://m.baidu.com");
}
class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
@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);
mWvMain.evaluateJavascript("javascript:alert('Info: Page loaded')", null);
}
}
class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
setTitle(title);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==event.KEYCODE_BACK && mWvMain.canGoBack()){
mWvMain.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}