WebView 应用
禁止 webview 解决长按事件
设置 OnLongClickListener 把长按事件生产掉。
web.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {return true;}
});
扭转字体大小
字体大小的枚举。
public static enum TextSize {SMALLEST(50),
SMALLER(75),
NORMAL(100),
LARGER(125),
LARGEST(150);
int value;
private TextSize(int var3) {this.value = var3;}
}
获取 WebSettings
,而后设置字体大小。
WebSettings st = wv.getSettings();
st.setTextSize(WebSettings.TextSize.LARGER);
显示 html 文本
示例:示例中用到的 html 文本与 TextView 显示 Html 雷同。
private static final String T1 = "<p>Tell me the <font color=\"red\">color</font></p>";
private static final String H1 = "<p>Tell me the <text style=\"color: blue; font-weight: bold;\">color</text>.</p>";
private static final String H1_FIX = "<p>Tell me the <b><font color=\"blue\">color</font></b>.</p>";
wb1.loadData(T1, "text/html", "UTF-8");
wb2.loadData(H1, "text/html", "UTF-8");
wb3.loadData(H1_FIX, "text/html", "UTF-8");
layout 中搁置 WebView
<WebView
android:id="@+id/web3"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
WebView 显示 Html 文本效果图
之前 TextView 显示不出色彩和加粗的 H1
,在 webView 中能够失常显示。
下面的 loadData
办法中指定了 mimeType 为 text/html
,编码类型 UTF-8
。
WebView loadData 中文乱码
应用 loadData
呈现中文乱码。
String htmlData = "<p>This is me. 我是文本 Text.</p>";
webView.loadData(htmlData, "text/html", "UTF-8"); // 某些机型呈现中文乱码
应用 loadDataWithBaseURL
办法躲避中文乱码问题。
webView.loadDataWithBaseURL(null, htmlData, "text/html", "UTF-8", null);
WebView 加载 assets 中的网页
咱们把网页文件放到 assets
目录中。
设置WebSettings
,容许读取文件等等。
assets
目录的门路以 file:///android_asset/
结尾。
WebView webView = findViewById(R.id.web2);
String url = "file:///android_asset/drag-to/index.html";
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowContentAccess(true);
webSettings.setDomStorageEnabled(true);
webView.loadUrl(url);
WebView 常见问题
1. 针对加载 webView 中的资源时放慢加载的速度优化(次要是针对图片)
起因:html 代码下载到 WebView 后,webkit 开始解析网页各个节点,发现有内部款式文件或者内部脚本文件时,会异步发动网络申请下载文件,但如果在这之前也有解析到 image 节点,那势必也会发动网络申请下载相应的图片。在网络状况较差的状况下,过多的网络申请就会造成带宽缓和,影响到 css 或 js 文件加载实现的工夫,造成页面空白 loading 过久。
解决办法:通知 WebView 先不要主动加载图片,等页面 finish 后再发动图片加载。
// 初始化的时候设置,具体代码在 WebView 类中
if(Build.VERSION.SDK_INT >= KITKAT) {
// 设置网页在加载的时候临时不加载图片
webView.getSettings().setLoadsImagesAutomatically(true);} else {webView.getSettings().setLoadsImagesAutomatically(false);}
/**
* 当页面加载实现会调用该办法
* @param view view
* @param url url 链接
*/
@Override
public void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);
// 页面 finish 后再发动图片加载
if(!webView.getSettings().getLoadsImagesAutomatically()) {webView.getSettings().setLoadsImagesAutomatically(true);
}
}
2.WebView 硬件加速导致页面渲染闪动
起因:4.0 以上的零碎咱们开启硬件加速后,WebView 渲染页面更加疾速,拖动也更加顺滑。但有个副作用就是,当 WebView 视图被整体遮住一块,而后忽然复原时(比方应用 SlideMenu 将 WebView 从侧边滑进去时),这个过渡期会呈现白块同时界面闪动。
解决办法:是在过渡期前将 WebView 的硬件加速长期敞开,过渡期后再开启。
// 敞开硬件加速
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
// 开启硬件加速
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {webview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
3. 能够提前显示加载进度条
起因:WebView.loadUrl(“url”) 不会立马就回调 onPageStarted 或者 onProgressChanged 因为在这一时间段,WebView 有可能在初始化内核,也有可能在与服务器建设连贯,这个时间段容易呈现白屏,白屏用户体验是很蹩脚的。
解决办法:提前显示进度条尽管不是晋升性能,然而对用户体验来说也是很重要的一点。
// 正确
pb.setVisibility(View.VISIBLE);
mWebView.loadUrl("https://github.com/");// 不太好
@Override
public void onPageStarted(WebView webView, String s, Bitmap bitmap) {super.onPageStarted(webView, s, bitmap);
// 设定加载开始的操作
pb.setVisibility(View.VISIBLE);
}
// 上面这个是监听进度条进度变动的逻辑
mWebView.getWebChromeClient().setWebListener(interWebListener);
mWebView.getWebViewClient().setWebListener(interWebListener);
private InterWebListener interWebListener = new InterWebListener() {
@Override
public void hindProgressBar() {pb.setVisibility(View.GONE);
}
@Override
public void showErrorView() {}
@Override
public void startProgress(int newProgress) {pb.setProgress(newProgress);
}
@Override
public void showTitle(String title) {}};
4. WebView 明码明文存储破绽优化
起因:WebView 默认开启明码保留性能 mWebView.setSavePassword(true),如果该性能未敞开,在用户输出明码时,会弹出提示框,询问用户是否保留明码,如果抉择”是”,明码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取明码的危险。
解决办法:通过 WebSettings.setSavePassword(false) 敞开明码保留揭示性能。
// 设置是否开启明码保留性能,不倡议开启,默认曾经做了解决,存在盗取明码的危险
WebView.setSavePassword(false);
5. 自定义加载异样 error 的状态页面,比方上面这些办法中可能会呈现 error
起因:当 WebView 加载页面出错时(个别为 404 NOT FOUND,Android WebView 会默认显示一个出错界面。当 WebView 加载出错时,会在 WebViewClient 实例中的 onReceivedError()`,还有 onReceivedTitle
办法接管到谬误。
解决办法:自定义谬误页面款式。
/**
* 申请网络呈现 error
* @param view view
* @param errorCode 谬误
* @param description description
* @param failingUrl 失败链接
*/
@Override
public void onReceivedError(WebView view, int errorCode, String description, String
failingUrl) {super.onReceivedError(view, errorCode, description, failingUrl);
if (errorCode == 404) {
// 用 javascript 暗藏零碎定义的 404 页面信息
String data = "Page NO FOUND!";
view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
} else {if (webListener!=null){webListener.showErrorView();
}
}
}
// 向主机应用程序报告 Web 资源加载谬误。这些谬误通常表明无奈连贯到服务器。// 值得注意的是,不同的是过期的版本的回调,新的版本将被称为任何资源(iframe,图像等)// 不仅为主页。因而,倡议在回调过程中执行最低要求的工作。// 6.0 之后
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {X5WebUtils.log("服务器异样"+error.getDescription().toString());
}
//ToastUtils.showToast("服务器异样 6.0 之后");
// 当加载谬误时,就让它加载本地谬误网页文件
//mWebView.loadUrl("file:///android_asset/errorpage/error.html");
if (webListener!=null){webListener.showErrorView();
}
}
/**
* 这个办法次要是监听题目变动操作的
* @param view view
* @param title 题目
*/
@Override
public void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);
if (title.contains("404") || title.contains("网页无奈关上")){if (webListener!=null){webListener.showErrorView();
}
} else {// 设置 title}
}
【Android 零根底入门教程视频参考】