Android关于webview的开发心得(笔记(二)解决webview的重定向、加载https网页)
关于
本篇主要是一些常用webview的设置的复用编写(包括常用加载H5页面的配置、重定向问题解决得配置)。第二个就是解决加载https网页的白屏问题。在上一篇的项目上,我们进行修改优化。
当然啦,我的开源库webloading已经解决了绝大部分的webview使用问题,详情见WebLoading开源库,支持https访问
第一步,新增WebViewSettings.java
我们先写一个webview的一些配置的复用方法,以便多个模块、多个页面调用webview的复用:
public class WebViewSettings {
static Context mContext;
static Dialog mDialog;
public static void SetWebSettings(WebView webView, String url, Dialog dialog){
WebSettings webSettings = webView.getSettings();
webSettings.setSupportZoom(true);
webSettings.setUseWideViewPort(true);
webSettings.setAllowFileAccess(true); //这里是支持文件操作,比如从相册等选取图片
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setLoadsImagesAutomatically(true);
// webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //自适应屏幕
webSettings.setLoadWithOverviewMode(true);
// webSettings.setBuiltInZoomControls(true); //设置是否出现缩放工具
webSettings.setJavaScriptEnabled(true);//设置调用JS方法
saveData(webSettings);
newWin(webSettings);
mDialog = dialog;
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
webView.loadUrl(url);
}
static WebViewClient webViewClient = new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//下一篇将会使用进度条代替这个,进一步优化用户体验感
DialogUtil.closeDialog(mDialog);
}
/**
* 解决重定向
* 多页面在同一个WebView中打开,就是不新建activity或者调用系统浏览器打开
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
};
static WebChromeClient webChromeClient = new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
//这里放进度条,下一篇将会使用进度条展示取代加载框提示
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(view);
resultMsg.sendToTarget();
return true;
}
};
/**
* 多窗口的问题
*/
private static void newWin(WebSettings webSettings) {
//html中的_bank标签就是新建窗口打开,有时候会打不开,需添加如下
webSettings.setSupportMultipleWindows(false);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
//然后 复写 WebChromeClient的onCreateWindow方法
}
/**
* HTML5数据存储
*/
private static void saveData(WebSettings webSettings) {
mContext = App.getInstance();
//有时候网页需要自己保存一些关键数据,Android WebView 需要自己设置
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setAppCacheEnabled(true);
String appCachePath = mContext.getApplicationContext().getCacheDir().getAbsolutePath();
webSettings.setAppCachePath(appCachePath);
}
}
第二步,修改MainActivity.java
public class MainActivity extends AppCompatActivity {
private WebView webView;
Dialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
mDialog = DialogUtil.createLoadingDialog(this,"加载中...");
String url = "https://blog.youkuaiyun.com/tobey_r1";
WebViewSettings.SetWebSettings(webView,url,mDialog);
}
}
效果图
问题
加载框消失时机和网址内容展现不符,下一篇将介绍进度条使用。以及一些去广告。