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链接 */@Overridepublic 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/");//不太好@Overridepublic 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 失败链接 */@Overridepublic 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 之后@Overridepublic 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 题目 */@Overridepublic void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); if (title.contains("404") || title.contains("网页无奈关上")){ if (webListener!=null){ webListener.showErrorView(); } } else { // 设置title }}
【Android 零根底入门教程视频参考】