package ren.solid.library.fragment;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import ren.solid.library.R;
import ren.solid.library.fragment.base.BaseFragment;
import ren.solid.library.utils.WebViewUtil;
/**
* Created by _SOLID
* Date:2016/3/31
* Time:14:27
*/
public class WebViewFragment extends BaseFragment {
protected WebView mWebView;
protected ProgressBar mProgressBar;
protected String mUrl;
public static WebViewFragment newInstance(final String url) {
WebViewFragment fragment = new WebViewFragment();
fragment.mUrl = url;
return fragment;
}
@Override
protected int setLayoutResourceID() {
return R.layout.fragment_webview;
}
/**
* 需要加载的Url<br/>
* assert中的文件:file:///android_asset/about.htm<br/>
* 网页: http://www.jianshu.com/users/6725c8e8194f/<br/>
* <p/>
*
* @return 需要加载的Url
*/
protected String getLoadUrl() {
return mUrl;
}
@Override
protected void setUpView() {
mProgressBar = (ProgressBar) getContentView().findViewById(R.id.progressbar);
mWebView = (WebView) getContentView().findViewById(R.id.webView);
WebViewUtil.setWebViewOptions(mWebView);
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.setWebChromeClient(new MyWebChromeClient());
mProgressBar.setMax(100);
mWebView.loadUrl(getLoadUrl());
}
@Override
protected void setUpData() {
}
private void initWebViewSettings() {
WebSettings webSettings = mWebView.getSettings();
//支持获取手势焦点,输入用户名、密码或其他
mWebView.requestFocusFromTouch();
webSettings.setJavaScriptEnabled(true); //支持js
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。
//若上面是false,则该WebView不可缩放,这个不管设置什么都不能缩放。
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
webSettings.supportMultipleWindows(); //多窗口
// webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
webSettings.setAllowFileAccess(true); //设置可以访问文件
webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
}
public boolean canGoBack() {
return mWebView != null && mWebView.canGoBack();
}
public void goBack() {
if (mWebView != null) {
mWebView.goBack();
}
}
//WebViewClient就是帮助WebView处理各种通知、请求事件的。
class MyWebViewClient extends 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);
onPageLoadFinished(view, url);
}
// shouldOverrideUrlLoading(WebView view, String url) 最常用的,比如上面的。
// //在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。
// //比如获取url,查看url.contains(“add”),进行添加操作
//
// shouldOverrideKeyEvent(WebView view, KeyEvent event)
// //重写此方法才能够处理在浏览器中的按键事件。
//
// onPageStarted(WebView view, String url, Bitmap favicon)
// //这个事件就是开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。
//
// onPageFinished(WebView view, String url)
// //在页面加载结束时调用。同样道理,我们可以关闭loading 条,切换程序动作。
//
// onLoadResource(WebView view, String url)
// // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
//
// onReceivedError(WebView view, int errorCode, String description, String failingUrl)
// // (报告错误信息)
//
// doUpdateVisitedHistory(WebView view, String url, boolean isReload)
// //(更新历史记录)
//
// onFormResubmission(WebView view, Message dontResend, Message resend)
// //(应用程序重新请求网页数据)
//
// onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)
// //(获取返回信息授权请求)
//
// onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
// //重写此方法可以让webview处理https请求。
//
// onScaleChanged(WebView view, float oldScale, float newScale)
// // (WebView发生改变时调用)
//
// onUnhandledKeyEvent(WebView view, KeyEvent event)
// //(Key事件未被加载时调用)
}
//WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 0) {
loadStart();
} else if (newProgress > 90) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
}
}
// //获取Web页中的title用来设置自己界面中的title
// //当加载出错的时候,比如无网络,这时onReceiveTitle中获取的标题为 找不到该网页,
// //因此建议当触发onReceiveError时,不要使用获取到的title
// @Override
// public void onReceivedTitle(WebView view, String title) {
// MainActivity.this.setTitle(title);
// }
//
// @Override
// public void onReceivedIcon(WebView view, Bitmap icon) {
// //
// }
//
// @Override
// public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
// //
// return true;
// }
//
// @Override
// public void onCloseWindow(WebView window) {
// }
//
// //处理alert弹出框,html 弹框的一种方式
// @Override
// public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// //
// return true;
// }
//
// //处理confirm弹出框
// @Override
// public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult
// result) {
// //
// return true;
// }
//
// //处理prompt弹出框
// @Override
// public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
// //
// return true;
// }
}
protected void loadStart() {
}
protected void onPageLoadFinished(WebView view, String url) {
}
@Override
public void onPause() {
super.onPause();
if (mWebView != null)
mWebView.onPause();
}
@Override
public void onResume() {
super.onResume();
if (mWebView != null)
mWebView.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mWebView != null)
mWebView.destroy();
}
}