概述
今天来看看WebView的一些使用
代码
public class MainActivity extends AppCompatActivity {
private WebView webView;
private TextView textView;
private View errorView;
private boolean isErrorPage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
textView = (TextView) findViewById(R.id.tv_title);
webView.loadUrl("https://www.baidu.com/");
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
textView.setText(title);//显示标题
}
});
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
//处理错误页面
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//两种方法,1,加载本地页面 2,加载native代码
showErrorPage();
Toast.makeText(MainActivity.this, "加载网页出错", Toast.LENGTH_SHORT).show();
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if(!isErrorPage){
hideErrorPage();
}
}
});
// webView.setDownloadListener(new DownloadListener() {
// @Override
// public void onDownloadStart(String s, String s1, String s2, String s3, long l) {
// //在这个方法里执行下载任务
// }
// });
}
//退出当前页面
public void back(View view){
finish();
}
// //刷新
// public void refresh(View view){
// webView.reload();
// }
/**
* 初始化错误页面
*/
public void initErrorPage(){
errorView = View.inflate(this, R.layout.web_error_layout, null);
Button btnRetry = (Button) errorView.findViewById(R.id.btn_retry);
btnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.reload();
isErrorPage = false;
}
});
}
/**
* 显示错误页面
*/
public void showErrorPage(){
LinearLayout webParent = (LinearLayout) webView.getParent();
initErrorPage();
while(webParent.getChildCount()>1){
webParent.removeViewAt(0);
}
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
webParent.addView(errorView,0,params);
isErrorPage = true;
}
/**
* 隐藏错误页面
*/
public void hideErrorPage(){
LinearLayout webParent = (LinearLayout) webView.getParent();
isErrorPage = false;
while(webParent.getChildCount()>1){
webParent.removeViewAt(0);
}
}
/**
* WebView同步Cookie步骤
* 1.客户端访问登陆接口,登录成功后从服务器获取到cookie信息
* 2.将获取到的cookie信息同步到WebView
* 3.然后在访问服务器登录页面,
* 4.服务器那边需要做判断,判断cookie,如果是需要的cookie,则直接跳到下一个页面
*/
/***
* 如果用户已经登录,则同步本地的cookie到webview中
*/
// public void synCookies() {
// if (!CacheUtils.isLogin(this)) return;
// CookieSyncManager.createInstance(this);
// CookieManager cookieManager = CookieManager.getInstance();
// cookieManager.setAcceptCookie(true);
// cookieManager.removeSessionCookie();//移除
// String cookies = PreferenceHelper.readString(this, AppConfig.COOKIE_KEY, AppConfig.COOKIE_KEY);
// KJLoger.debug(cookies);
// cookieManager.setCookie(url, cookies);
// CookieSyncManager.getInstance().sync();
// }
}
/**
* WebView月js调用混淆问题
* 程序打包后可能会出现js无法调用native代码,因为native代码进行了混淆
* 解决办法:
* 在混淆文件中配置js调用的方法不被混淆
*/
/**
* WebView自定义协议拦截问题
*/
在js调用本地Java代码的时候,我们可以自定义协议,这样做可以提高安全性
**效果图**

我们在js代码中启动本地的一个Activity,Js代码如下
<html>
<head>
<script type="text/javascript">
function updateHtml(){
document.getElementById("content").innerHTML =
"你通过 android 中的控件调用了html 中js 的方法";
}
</script>
</head>
<body>
this is my html <a onClick="window.login.startFunction()" href="";>调用java中的方法</a>
<a href="http://demo/startActivity">load page</a>
<span id="content"></span>
</body>
</html>
这里我们自定义了一个连接,后缀名是startActivity,然后我们在客户端进行判断,
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
if(url.endsWith("startActivity")){
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
return super.shouldOverrideUrlLoading(view, url);
}
如果协议是我们所需要的,就执行对应的请求。
最后给出代码的下载位置
9万+

被折叠的 条评论
为什么被折叠?



