最近在做项目,使用到了WebView加载JavaScript界面,遇到了一些不大不小的问题,在这里做一些总结,为以后的开发奠定一下基础。
本文分七个部分
1.设置WebView与JavaScript可交互
2.实现对网页中超链接按钮的响应
3.获取网页的页面标题
4.给WebView加载网页添加进度条
5.获取定位信息并传递给JavaScript
6.设置定位缓存路径
7.WebView的刷新,后退,加载界面以及单击返回按钮返回到上一个界面
1.设置WebView与JavaScript可交互(此处非常简单只需要一句代码即可)
webView.getSettings().setJavaScriptEnabled(true);
2.实现对网页中超链接按钮的响应(需要给WebView设置setWebViewClient,并重写其中的shouldOverrideUrlLoading方法)
//对网页中超链接按钮的响应
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
3.获取网页的页面标题(需要给WebView设置setWebViewClient,并重写其中的onPageFinished方法)
//获取页面标题
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
title.setText(view.getTitle());
}
4.给WebView加载网页添加进度条(需要给WebView设置setWebChromeClient,并重写其中的onProgressChanged方法,并将ProgressBar控件与其进行绑定)
//给WebView添加进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress==100){
progressBar.setVisibility(View.GONE);
}else{
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(newProgress);
}
}
5.获取定位信息并传递给JavaScript(需要给WebView设置setWebChromeClient,并重写其中的onGeolocationPermissionsShowPrompt方法)
//onGeolocationPermissionsShowPrompt 该方法被WebView回调,以获取定位信息并传给JavaScript
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin,true,false);
}
6.设置定位缓存路径
//Geolocation需要用数据库来缓存定位信息和相关权限设置信息,所以设置定位信息缓存路径
//如果不设置缓存路径的话,缓存的存储将不会被自动分配
webView.getSettings().setGeolocationDatabasePath(this.getFilesDir().getPath());
7.WebView的刷新,后退,加载界面以及单击返回按钮返回到上一个界面
//WebView的刷新
webView.reload();
//WebView的后退
webView.goBack();
//WebView的加载界面
webView.loadUrl(result);
//单击返回按钮WebView回到上一个界面
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN){
if (keyCode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){
webView.goBack();
return true;
}
}
return false;
}
});
关于WebView使用的完整代码:
public class WebViewActivity extends AppCompatActivity {
private WebView webView;
private TextView title;
private ProgressBar progressBar;
private String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_result);
//初始化控件
initView();
result = getIntent().getStringExtra("result");//获取传递过来的网络接口
//webView的相关配置
settingWebView(result);
}
//初始化控件
private void initView() {
title = (TextView) findViewById(R.id.activity_scan_result_title);
webView = (WebView) findViewById(R.id.activity_scan_result_web_view);
progressBar = (ProgressBar) findViewById(R.id.activity_scan_result_progressbar);
}
//webView的相关配置
private void settingWebView(String result) {
//Web与JavaScript可交互
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
//对网页中超链接按钮的响应
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
//获取页面标题
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
title.setText(view.getTitle());
}
});
webView.setWebChromeClient(new WebChromeClient(){
//给WebView添加进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress==100){
progressBar.setVisibility(View.GONE);
}else{
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(newProgress);
}
}
//onGeolocationPermissionsShowPrompt 该方法被WebView回调,以获取定位信息并传给JavaScript
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin,true,false);
}
});
//Geolocation需要用数据库来缓存定位信息和相关权限设置信息,所以设置定位信息缓存路径.如果不设置缓存路径的话,缓存的存储将不会被自动分配
webView.getSettings().setGeolocationDatabasePath(this.getFilesDir().getPath());
webView.loadUrl(result);
//单击返回按钮WebView回到上一个界面
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN){
if (keyCode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){
webView.goBack();
return true;
}
}
return false;
}
});
}
public void BackClick(View view) {
Intent intent = new Intent(ScanResultActivity.this,ScanActivity.class);
startActivity(intent);
finish();
}
public void ButtonClick(View view) {
switch (view.getId()){
case R.id.button1:
webView.reload();//WebView 的刷新
break;
case R.id.button2:
webView.goBack();//WebView 的后退
break;
}
}
}