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 零根底入门教程视频参考】