WebView 使用

Android中一个用于网页显示的控件,实际上,也可以看做一个功能最小化的浏览器,看起来类似于在微信中打开网页链接的页面。WebView主要用于在app应用中方便地访问远程网页或本地html资源。同时,WebView也在Android中充当Java代码和JS代码之间交互的桥梁。
WebView基本用法
设置WebView至少有两种方法
1、布局文件中添加WebView控件 & Activity中设置加载页面
2、调用setContentView()方法,直接通过代码创建
一般采用第一种方法,在 Activity中设置加载页面步骤如下
设置加载网址并使用loadUrl()方法加载
对变量private WebView wView;、
1、电脑本地文件:放在app/src/main/assets下的html

wView.loadUrl("file:///android_asset/test.html");

2、手机本地文件

wView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

远程资源:
需先在清单文件 AndroidManifest文件中为app申请网络使用权限:

<uses-permission android:name="android.permission.INTERNET"/>

填入网页地址进行加载

wView.loadUrl("https://www.cnblogs.com/ifever/")

加载 HTML 页面的一小段内容

wView.loadData(String data, String mimeType, String encoding)

默认情况下,WebView会调用系统默认浏览器加载传入的网址或者资源。如果需要在当前app页面内加载,则需要设置WebViewClient 中的shouldOverrideUrlLoading()方法
在当前app页面内加载

wView.setWebViewClient(new WebViewClient() { 
	@Override 
	public boolean shouldOverrideUrlLoading(WebView view, String url) {
	 	return false; 
	} 
	@Override 
	public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
		return false; 
	}
}

以上两个方法都会在WebView加载新的url时触发。
Android 5.0以下系统会回调第一个方法,反之回调第二个方法。因此,为了兼容不同的系统版本,可以同时重写这两个方法。
可以看到,这两个方法都有一个boolean返回值。假如修改为true,会带来重定向问题。
返回键始终无法退出应用:重定向问题
设置true的代码如下

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
	view.loadUrl(url);
	//手动加载 
	return true; 
	} 
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
	view.loadUrl(request.getUrl().toString());
	//手动加载 
	return true;
}

虽然不会影响加载,不过会带来用户点击回退键始终无法退出应用的问题,下面简单介绍下原理:
假设访问网页过程为A - > B - > C共三个站点,在C时点回退,C - > B没问题,接着再点 B -> A,这个时候问题出现了。尽管B来到了A,但是因为重定向又跳转到了B,如此循环往复…
返回值设为false的情况(且删去view.loadUrl()方法)就可解决这种问题。其实无论返回true还是false,只要为WebView设置了WebViewClient,都不影响正常的加载功能,只是系统就不会再将url交给第三方的浏览器去处理了。
这两种返回值的真正区别是这样的:
shouldOverrideUrlLoading返回false,代表将url交给当前WebView加载,也就是正常的加载状态;shouldOverrideUrlLoading返回true,代表开发者已经对url进行了处理,WebView就不会再对这个url进行加载了。可以用于屏蔽某些网址,借此实现黑名单机制。
解决了用户点击回退键始终无法退出应用,但还存在一个显著问题:用户希望回退到上一级页面,却直接退出了app
回退问题解决方法:

goBack() //回退到上一级页面
canGoBack()//能否回退到上一级页面
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
	if (keyCode == KeyEvent.KEYCODE_BACK && wView.canGoBack()){ 
		//如果按下返回键,同时又可以回退到上一级页面,就返回上一级 
		wView.goBack();
		 return true; 
	} 
	return super.onKeyDown(keyCode,event); 
}

默认情况下,返回键会执行finish()方法,结束当前Activity。
有些app为了防止用户误触,在按下返回键且无法回退上一级页面时,会提示需要再次按下返回键,才结束当前Activity。这意味着需要在一定时间内连续按动两次返回键才可退出,设计更加人性化。将上述代码改为

private long exitTime = 0; 
@Override 
public void onBackPressed() { 
	if (wView.canGoBack()) { 
		wView.goBack(); 
	} else { 
		if ((System.currentTimeMillis() - exitTime) > 2000) { 
		Toast.makeText(getApplicationContext(), "再按一次退出程序", 				Toast.LENGTH_SHORT).show(); 	
		exitTime = System.currentTimeMillis(); 
	} else { 
		finish(); 
		} 
	} 
}

此外修改布局文件,通过添加按钮并编写,也可以添加其他新功能,常用的有

finish(); //关闭当前Activity,一键退出
wView.reload(); //刷新当前页面
wView.setScrollY(0); //滚动到顶部

添加进度条

public void onProgressChanged(WebView view, int newProgress){
	super.onProgressChanged(view,newProgress);
}

newProgress*100,即可获得当前加载的百分比,具体方法网上可查,这里暂不深入
标题改为当前网页标题

public void onReceivedTitle(WebView view, String title) {
	tTitle(title);
}

在开通Java权限后,可以设置网页弹窗,至少有两种方式,alert、confirm、prompt三种类型的弹窗

wView.loadUrl("javascript:alert('hello')");
wView.evaluateJavascript("javascript:alert('hello')",null);

放置位置如下:

wView.setWebViewClient(new WebViewClient() { 
// @Override 
// public boolean shouldOverrideUrlLoading(WebView view, String url) { 
// return false; 
// } 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
return false; 
} 
@Override 
public void onPageFinished(WebView view, String url) { 
//网页加载完成时 
super.onPageFinished(view, url); 
//wView.loadUrl("javascript:alert('hello')"); // 		wView.evaluateJavascript("javascript:alert('hello')",null); 
}
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值