乐趣区

关于android:Android入门教程-WebView-一

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

退出移动版