webview是Android展示网页信息的控件,本文就来详细讲解这个控件的用法。虽说是详细讲解,但也仅仅是提供入门使用,对于很多高级要求,这里暂不涉及。
一、初识webview
1.1 放入自己的工程
使用控件仍旧是老样子,在xml中写入,在java中找到控件并进行处理。此外还要记得加访问网络的权限。
<uses-permission android:name="android.permission.INTERNET" />
xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout>
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = (WebView) findViewById(R.id.webView); webView.loadUrl("http://www.baidu.com/"); }
这样其实就可以运行啦,但是你在运行的时候会发现程序启动后会有下面的界面
也就是说这个控件当前没有自己展示网页的能力,还需要调用浏览器来实现。
二、WebView的方法
2.1 加载特定网页
webView.loadUrl("http://www.baidu.com/");
2.2 加载本地的html文件
现将本地文件放入asset中,然后用下面的方法加载
webView.loadUrl("file:///android_asset/XX.html");
2.3 加载html字符串
String htmlString = "<h1>Title</h1><p>This is HTML text<br /><i>Formatted in italics</i><br />Anothor Line</p>"; // 载入这个html页面 webView.loadData(htmlString, "text/html", "utf-8");
2.4 加载指定的url并携带http header数据
public void loadUrl (String url, Map<String, String> additionalHttpHeaders)
2.5 重新加载
注意:所有资源都会重新加载,慎用
public void reload ()
2.6 结束加载
public void stopLoading ()
2.7 前进或后退到指定点
以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进
public void goBackOrForward (int steps)
更多的API请参考这篇博文:http://blog.csdn.net/typename/article/details/39030091
三、使用WebViewClient
webview可以设置一个webviewclient对象,通过它就可以来进行网页加载的处理了。
3.1 shouldOverrideUrlLoading
shouldOverrideUrlLoading并不是每次都在onPageStarted之前开始调用的,就是说一个新的URL不是每次都经过shouldOverrideUrlLoading的,只有在调用webview.loadURL的时候才会调用。而设置loadUrl时候是用哪个浏览器来加载。
WebView webView = (WebView) findViewById(R.id.webView); webView.loadUrl("http://www.baidu.com/");
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }
如上面展示的,webview首先调用loadURL方法,然后webviewClient触发了加载url的方法,然后将展示网页的工作自己承担了下来。重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。
如果你想要webview屏蔽某个网站的超链接,或者是要对某些特殊的url进行处理,那么就需要在这里进行修改啦。屏蔽连接的话,直接返回true即可,如果要进行url判断,可以如下操作
if (url.endsWith(".apk")) { download(url);//下载处理 }
3.2 onLoadResource
在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。如下的load会在网页加载元素时调用很多次。
@Override public void onLoadResource(WebView view, String url) { // TODO 自动生成的方法存根 super.onLoadResource(view, url); System.out.println("load"); }
3.3 onPageStarted & onPageFinished
网页开始加载和结束加载时调用,一般的过程就是onpageStarted->onLoadResource->onPageFinished
@Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO 自动生成的方法存根 super.onPageStarted(view, url, favicon); Log.i(TAG, "onPageStarted"); } @Override public void onPageFinished(WebView view, String url) { // TODO 自动生成的方法存根 super.onPageFinished(view, url); Log.i(TAG, "onPageFinished"); }
四、处理前进和后退操作
我们应该对webview进行前进和后退的处理,需要在activity的按键时间中处理。这样我们就能通过手机的返回键进行网页的返回了。
public boolean onKeyDown(int keyCoder, KeyEvent event) { /** * canGoBack()检查是否有可以后退的记录 * anGoForward()方法可以检查是否有可以前进的历史记录。 如果你不执行这种检查,一旦 goBack() 和 goForward()方法到达历史记录顶端,它们将什么也不做。 */ if (webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK) { //webView.goForward(); // 前进 webView.goBack(); // goBack()表示返回webView的上一页面,后退 return true; } return false; }