您的位置:首页 > 理论基础 > 计算机网络

Iwfu-安卓网络应用---WebView

2016-04-04 22:04 423 查看

WebView

类似于ImageView,WebView组件本身就是一个浏览器的实现,他的内核基于WebKit引擎,用于访问网页。

(WebKit 是一个开源的浏览器引擎,关于WebKit参见:


http://blog.csdn.net/horkychen/article/details/8629976)

Example: 基于WebView开发一个简单的浏览器

布局文件 : 一个简单按钮,一个地址输入框,一个WebView用于显示网页 ,一个ProgressBar用于显示网页加载进度.

类似于普通组件,findViewById找到WebView,按下按钮后调用webView.loadUrl(),传入EditText输入的网址,加载网页.


编码过程中出现的问题:

1-点击按钮调用webview.loadUrl()方法会调用到系统浏览器,而不是在app的webview打开网页.

2-若网页中有超链接,点击链接后不是在本app的webview中跳转,而是调用系统浏览器。

原因: webView.loadUrl()时,webView会默认给系统处理加载url的机会,若系统有浏览器则会调用系统浏览器打开网页.

解决方案:
自定义类继承WebViewClient, 然后webView.setWebViewClient方法传入自定义的WebViewClient


关键代码:

//自定义WebViewClient类
private class MyWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
//设置自定义WebViewClient
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(new MyWebViewClient ());


//按钮点击事件:
btn_go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取地址栏输入网址
final String urlString = et_inputURL.getText().toString();
//如果以http://开头,则直接访问网页,否则加上  http://再访问网页 if (urlString.startsWith("http://")) {
webView.loadUrl(urlString);
return ;
} else {
webView.loadUrl("http://" + urlString);
return;
}

}
});


现在我们可以按下按钮就直接在本APP的WebView里打开网页了.

3-怎么实现按回退键后,webView返回上一个网页而不是退出当前APP

方法:重写onKeyDown方法

@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
if ((keyCode==KeyEvent.KEYCODE_BACK)&&webView.canGoBack()){
webView.goBack ();  //goBack表示返回上一个页面
return true;
}
return false;
}


现在访问后按下回退键可以返回上一个网页了.

4-点击网页上的链接,按钮没反应

设置webView能使用JavaScript脚本,能与网页上的按钮链接等交互.

webView.getSettings().setJavaScriptEnabled(true);


5-设置标题栏显示网页的标题(toolbar/actionbar等设置标题为网页的名字),加载完后地址栏和标题栏都随之改变

可以自定义类继承WebChromeClient,重写onReceivedTitle()方法,在加载完网页后就可以获取到webview的title然后设webView.setWebChromeClient(new MyWebChromeClient());

代码如下:

@Override
public void onReceivedTitle(WebView view, String title) {
toolbar.setTitle (title);
et_inputURL.setText(view.getUrl());
}


现在每跳转到一个新网页,标题栏的名称和地址栏的网址都会随着网页的跳转而改变。

6-如何获取加载网页的进度

依然是自定义类继承WebChromeClient,重写onProgressChanged()方法,可以配合自己的ProgressBar显示出网页加载进度.

@Override
public void onProgressChanged(WebView view, int newProgress) {

progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(newProgress);
if (newProgress == 100) {
//设置加载完后隐藏progressBar
progressBar.setVisibility(View.GONE);
}
}


此时运行,测试,无论是加载网页,还是点击网页里的链接,地址栏和标题栏都显示正常

但按下回退键后,网页返回上一级,出现新的问题。

7-按下回退键,标题栏和地址栏不会随网页变化改变,仍然显示上一级网页的地址和标题

我在onProgressChaned方法中写入了改变地址栏和状态栏的方法。即在加载网页的同时就会通知改变地址栏和状态栏

代码:

private class MyWebChromeClient extends WebChromeClient {

@Override
public void onReceivedTitle(WebView view, String title) {           //原来的改变标题栏方法就可以注释掉
// toolbar.setTitle (title);
}

// 显示加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {

toolbar.setTitle(view.getTitle());//改变标题栏
et_inputURL.setText(view.getUrl());//改变地址栏

progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(newProgress);
if (newProgress == 100) {
//设置加载完后隐藏progressBar
progressBar.setVisibility(View.GONE);
}
}

}


至此,一个简单的基于WebView的浏览器就完成了,效果图:



附:源码下载

http://download.csdn.net/detail/rosechan/9481082
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: