package com.king.tv.mvp.fragment; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.king.base.util.LogUtils; import com.king.base.util.StringUtils; import com.king.base.util.SystemUtils; import com.king.tv.Constants; import com.king.tv.R; import butterknife.BindView; import butterknife.OnClick; /** * @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a> * @since 2017/3/21 */ public class WebFragment extends SimpleFragment { @BindView(R.id.ivLeft) ImageView ivLeft; @BindView(R.id.tvTitle) TextView tvTitle; @BindView(R.id.progressBar) ProgressBar progressBar; @BindView(R.id.vError) LinearLayout vError; @BindView(R.id.webView) WebView webView; private String url; private String title; protected boolean isError; private boolean isShowError; public static WebFragment newInstance(String url,String title) { Bundle args = new Bundle(); WebFragment fragment = new WebFragment(); fragment.url = url; fragment.title = title; fragment.setArguments(args); return fragment; } @Override public int getRootViewId() { return R.layout.fragment_webwiew; } @Override public void initUI() { if(!StringUtils.isBlank(title)){ tvTitle.setText(title); } progressBar.setMax(100); isShowError = addErrorView(vError); WebSettings ws = webView.getSettings(); //是否允许脚本支持 ws.setJavaScriptEnabled(true); ws.setDomStorageEnabled(true); ws.setJavaScriptCanOpenWindowsAutomatically(true); // ws.setCacheMode(WebSettings.LOAD_NO_CACHE); // webView.setHorizontalScrollBarEnabled(false); // webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); String str = getIntent().getStringExtra(Constants.KEY_URL); if(!TextUtils.isEmpty(str)){ this.url = str; } webView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); updateProgressBar(newProgress); } }); webView.setWebViewClient(getWebViewClient()); load(webView,url); } @Override public void initData() { } public WebViewClient getWebViewClient(){ return new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); LogUtils.d("startUrl:" + url); isError = false; webView.setVisibility(View.VISIBLE); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { LogUtils.d("url:" + url); return super.shouldOverrideUrlLoading(view,url); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); updateProgressBar(100); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); LogUtils.w("errorCode:" + errorCode + "|failingUrl:" + failingUrl); showReceiveError(); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error); handler.cancel(); handler.proceed(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); hideReceiveError(); } }; } /** * * @param group * @return true表示已添加ErrorView并显示ErrorView/false表示不处理 */ public boolean addErrorView(ViewGroup group){ group.addView(LayoutInflater.from(context).inflate(R.layout.layout_error,null)); return true; } private void showReceiveError(){ isError = true; if(SystemUtils.isNetWorkActive(context)){ LogUtils.w("Page loading failed."); }else{ LogUtils.w("Network unavailable."); } if(isShowError){ webView.setVisibility(View.GONE); vError.setVisibility(View.VISIBLE); } } private void hideReceiveError(){ if(isError){ showReceiveError(); }else{ webView.setVisibility(View.VISIBLE); vError.setVisibility(View.GONE); } } /** * 加载url * @param webView * @param url */ private void load(WebView webView,String url){ LogUtils.d("url:" + url); if(!TextUtils.isEmpty(url)){ webView.loadUrl(url); } } private boolean isGoBack(){ return webView!=null && webView.canGoBack(); } private void updateProgressBar(int progress){ updateProgressBar(true,progress); } private void updateProgressBar(boolean isVisibility,int progress){ progressBar.setVisibility((isVisibility && progress<100) ? View.VISIBLE : View.GONE); progressBar.setProgress(progress); } @OnClick(R.id.ivLeft) public void onClick(View v){ switch (v.getId()){ case R.id.ivLeft: finish(); break; } } }