WebView踩坑
1.WebView的配置
WebSettings settings = wvDetailContent.getSettings();
if (mPresenter.getNoImageState()) {
settings.setBlockNetworkImage(true);
}
if (mPresenter.getAutoCacheState()) {
settings.setAppCacheEnabled(true);
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
if (SystemUtil.isNetworkConnected()) {
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
} else {
settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
}
}
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setSupportZoom(true);
2.在html中引入外部css,js文件 常规拼接顺序css->html->js
/**
* @author xfhy
* @create at 2017/11/11 20:22
* description:html工具类,方便显示
* 在html中引入外部css,js文件 常规拼接顺序css->html->js
*/
object HtmlUtil {
private const val HIDE_HEADER_STYLE = "<style>div.headline{display:none;}</style>"
private const val NEEDED_FORMAT_CSS_TAG = "<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\"/>"
private const val NEEDED_FORMAT_JS_TAG = "<script src=\"%s\"></script>"
const val MIME_TYPE = "text/html; charset=utf-8"
const val ENCODING = "utf-8"
/**
* 根据css链接生成Link标签
*
* @param url String
* @return String
*/
fun createCssTag(url: String): String {
return String.format(NEEDED_FORMAT_CSS_TAG, url)
}
fun createCssTag(urls: List<String>): String {
val sb = StringBuffer()
for (url in urls) {
sb.append(createCssTag(url))
}
return sb.toString()
}
fun createJsTag(url: String): String {
return String.format(NEEDED_FORMAT_JS_TAG, url)
}
fun createJsTag(urls: List<String>): String {
val sb = StringBuilder()
for (url in urls) {
sb.append(createJsTag(url))
}
return sb.toString()
}
fun createHtmlData(html: String, cssList: List<String>, jsList: List<String>): String {
val css = createCssTag(cssList)
val js = createJsTag(jsList)
return "$css$HIDE_HEADER_STYLE$html$js"
}
}
3.开始加载
String htmlData = HtmlUtil.createHtmlData(zhihuDetailBean.getBody(),zhihuDetailBean.getCss(),zhihuDetailBean.getJs());
wvDetailContent.loadData(htmlData, HtmlUtil.MIME_TYPE, HtmlUtil.ENCODING);
4.回退处理
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && wvDetailContent.canGoBack()) {
wvDetailContent.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}