1.概述:
Android提供了一个WebView控件。借助它可以在自己的应用程序中嵌入一个浏览器,从而轻松的展示各种各样的网页。
2.获取手机网络状态:
利用网络管理器:ConnectivityManager类:
权限设置:
允许监听网络状态:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.WebView用法:
加载网页:
webview.loadUrl("http://www.baidu.com");
WebView有setWebChromeClient和setWebViewClient两种方法:
setWebChromeClient和setWebViewClient的使用区别:
- 1)使用WebChromeClient 可以操作Javascript dialogs(js脚本对话框), favicons(添加收藏的标志), titles(标题), 和 progress(进度条)。
简单的说,如果除了加载HTML的话,只需要用WebViewClient即可,但是在进行兼容互联网上附加javascript的页面的时候和调用javascript对话框的时候,或者功能较为复杂的内嵌操作的时候,建议使用WebChromeClient :
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
- 2)WebViewClient就是帮助WebView处理各种通知、请求事件的。包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
4.范例:
功能:利用webview加载百度网页,并且显示进度条加载的情况。
延伸功能:为了使页面点击返回时,能够显示上个页面而不是直接退出程序,这里还复写了按键的点击事件onKeyDown。
总代码:
public class MainActivity extends Activity implements OnClickListener {
private Button mButConntionclick;
private TextView mTextviewState;
private TextView mTextviewError;
private ConnectivityManager manager;
private WebView webview;
private ProgressBar proBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButConntionclick = (Button) findViewById(R.id.button_connctionclick);
mTextviewState = (TextView) findViewById(R.id.textview_conntinonstate);
mTextviewError=(TextView) findViewById(R.id.textview_error);
proBar=(ProgressBar) findViewById(R.id.probar);
webview = (WebView) findViewById(R.id.webview);
mButConntionclick.setOnClickListener(this);
mTextviewState.setOnClickListener(this);
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {//正在加载中时调用此方法
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
proBar.setProgress(newProgress);//将进度显示到进度条
}
});
webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {//页面加载结束时调用
// TODO Auto-generated method stub
super.onPageFinished(view, url);
proBar.setVisibility(View.INVISIBLE);//加载结束进度条不可见
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面加载开始调用
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
proBar.setVisibility(View.VISIBLE);
}
@Override//错误连接时调用,
public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {
//super.onReceivedError(view, errorCode, description, failingUrl);//注意将原来的复写父类的注释掉
mTextviewError.setVisibility(View.VISIBLE);
webview.setVisibility(View.INVISIBLE);
}
});
}
//webview.getSettings().setSupportZoom(true);
// 返回按键可以回到上一个界面,利用按键监听和webview的堆栈
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(webview.canGoBack()){
webview.goBack();
return true;//一种情况必须返回true,否则不执行
}else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button_connctionclick:
webview.loadUrl("http://www.bjlingzhuo.com");
break;
default:
break;
}
}
}
分析:
进度条的显示:
Back按键复写:
webview本身会有一个堆栈,当点击链接进入另一个页面,可以通过goback返回原来界面。
在6.0之前是用onReceivedError方法来处理链接错误的。
延伸功能:使页面能够支持缩放:
注:由于在百度一些网站是设置的自适应屏幕,所以它屏蔽了缩放功能,并不允许你缩放,所以这里可以打开别的网页尝试用一下代码,进行支持缩放功能的设置,这样之后,页面就可以愉快的进行缩放啦。
webview.getSettings().setBuiltInZoomControls(true);
效果演示: