前言:
如果你想要传送一个web应用作为客户端应用的一部分,那么,你可以使用webView来达到这一点;
webView允许你去显示一个web页面作为Activity布局的一部分;它并没有具备一个浏览器所有的特征;
比如导航的控制或者地址栏;默认地,webView所做的就是显示一个web页面;
添加一个WebView到应用中
添加WebView到应用中,仅仅只需在Activity的布局中添加<WebView>元素即可;例如,下面这个例子
是关于WebView全屏的例子;
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
在WebView中加载一个页面是通过 loadUrl()来实现的
例如:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");
在此之前,你的应用必须要有可访问网络的权限;在你的AndroidManifest.xml中添加如下所示:
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
以上就是WebView用来显示一个页面所需要做的工作;
在WebView中使用JavaScript
如果你加载的这个页面使用了JavaScript,那么你必须使能JavaScript;一旦JavaScript使能了,那么你就可以在你的应用和JavaScript
之间去创建接口;
使能JavaScript
默认情况下,JavaScript是没有使能的;你可以通过你的WebView的 WebSettings的setJavaScriptEnabled()方法去使能JavaScript;
而 WebSettings可用getSettings()方法来获取到;例如:
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
处理页面导航
当用户在你的webView中点击一个页面时,在Android中,其默认的行为是去开启一个应用去处理这个URL;通常,这个默认的浏览器
会被打开,然后去加载这个URL;当然,在你的WebView中,你可以重写这个行为,然后让其在你的WebView中去打开这个URL;
去打开用户点击的链接,仅仅只需要通过setWebViewClient()去提供一个WebViewClient,例如:
setWebViewClient
那么,用户所有点击的链接都会在你的WebView里边去进行打开了;
如果你想在一个链接进行加载的同时,有其他一些控制的话,那么你需要新建一个你自己的WebViewClient类,
然后重写shouldOverrideUrlLoading();例如:
shouldOverrideUrlLoading
然后创建这个WebViewClient类的实体:
setWebViewClient
现在当用户点击一个链接的时候,系统就会调用shouldOverrideUrlLoading()方法;在这个方法里边会去检查这个URL主机的域名是否与我们
在上述示例中所给出的域名匹配;若匹配,那么这个方法就会返回false,让WebView去加载这个URL;若不匹配,那么Intent会被创建,然后用来
去开启一个Activity来加载这个URL(这将会通过用户默认的浏览器来进行处理);
导航Web历史页面
当webView重写了URL Loading,那么,WebView自然会记录一些访问过的页面,你可以通过goBack() 和 goForward()方法来实现历史页面的
向前或者向后的访问;
例如:这是关于一个Activity的后退按钮如何实现后退的例子
onKeyDown
canGoBack
goBack
如果这确实存在一个用户访问过的页面,那么,canGoBack()方法就会返回true;同样,你可以使用canGoForward()方法去检查是否存在一个
向前访问过的历史页面;如果你没有做这一步检查,与此同时,用户到达了历史页面的末端,那么goBack() 或者 goForward()将什么都不做;
代码示例如下:
MainActivity:
package com.example.administrator.MyWebView;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/***
* 获取WebView控件
* **/
webView = (WebView) findViewById(R.id.wv);
/***
* 对于有JavaScript的部分,也能够予以显示
* **/
webView.getSettings().setJavaScriptEnabled(true);
/***
* 这是为了实现用户所点击的页面在WebView里边进行显示
* **/
webView.setWebViewClient(new 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);
}
});
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
}
});
/***
* 加载我们要访问的页面
* **/
webView.loadUrl("https://www.baidu.com/");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
/***
* 这是对访问过的历史页面的处理
* **/
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
activity_main.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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/wv"
/>
</LinearLayout>
运行结果:
总结:
WebView的作用就是可以实现在应用中实现内嵌网页进行浏览的效果
源码:
WebView示例源码