Android WebView常见问题

举报
计蒙不吃鱼 发表于 2022/05/21 15:18:19 2022/05/21
【摘要】 于 Android P (9.0)限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉,所以如果访问没有https协议的网站默认不不可以访问的。

前言

于 Android P (9.0)限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉,所以如果访问没有https协议的网站默认不不可以访问的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、webview的简单使用

1.load网址

  //找到控件
  web_view = (WebView) findViewById(R.id.web_view);
  //加载网页
  web_view.loadUrl(weburl);

如果你是真机调试,且手机系统比较高的话,应该会报错:网页无法加载,应为:net :ERR_CLEARTEXT_NOT_PERMITTED
解决方式于第二个某块

2.设置一些属性

        web_view = (WebView) findViewById(R.id.web_view);
        WebSettings webSettings = web_view.getSettings();
        // 让WebView能够执行javaScript
        webSettings.setJavaScriptEnabled(true);
        // 让JavaScript可以自动打开windows
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        //是否允许访问文件
        webSettings.setAllowFileAccess(true);
        // 设置缓存
        webSettings.setAppCacheEnabled(true);
        // 设置缓存模式,一共有四种模式
        webSettings.setCacheMode(webSettings.LOAD_CACHE_ELSE_NETWORK);
        // 支持缩放(适配到当前屏幕)
        webSettings.setSupportZoom(true);
        // 将图片调整到合适的大小
        webSettings.setUseWideViewPort(true);
        // 支持内容重新布局
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        // 设置可以被显示的屏幕控制
        webSettings.setDisplayZoomControls(true);
        // 设置默认字体大小
        webSettings.setDefaultFontSize(12);
        web_view.loadUrl(weburl);

这里就只介绍本例子用的一些属性了,如需了解更多,请前往Android中文文档

3.写一个监听

        web_view.setWebViewClient(new WebViewClient() {
            //当新的 url 即将被加载的时候---->用户点击了 Webview 内容里面的一个超链接的时候会触发该方法的调用
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
            //在页面加载开始时调用。
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }
            //在页面加载结束时调用。
            @Override
            public void onPageFinished(WebView view, String url) {
                weburl=url;
                super.onPageFinished(view, url);
            }

        });

这里主要介绍三个方法

4.返回上一次浏览的页面

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            if (web_view.canGoBack()) {
                web_view.goBack();
                return true;
            } else {
                finish();
                return true;
            }

        }
        return false;
    }

二、遇到的一些问题

1.ERR_CLEARTEXT_NOT_PERMITTED

原因:于 Android P (9.0)限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉,所以如果访问没有https协议的网站默认不不可以访问的。
解决:

在AndroidManifest.xml文件的application标签中添加

android:usesCleartextTraffic="true"

2.便页面支持缩放

WebSettings webSettings =web_view.getSettings();       
webSettings.setJavaScriptEnabled(true);  
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);

3.自适应屏幕

WebSettings webSettings =web_view.getSettings();       
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
webSettings.setLoadWithOverviewMode(true);

三、源码

WebActivity.java

public class WebActivity extends Activity {

    private WebView web_view;
    private String weburl = "http://www.jimengjia.com/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        initView();
        webViewClient();
        webViewSetting();
    }

    private void initView() {
        web_view = (WebView) findViewById(R.id.web_view);


    }
    private void webViewClient(){
        web_view.setWebViewClient(new WebViewClient() {
            //当新的 url 即将被加载的时候---->用户点击了 Webview 内容里面的一个超链接的时候会触发该方法的调用
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
            //在页面加载开始时调用。
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }
            //在页面加载结束时调用。
            @Override
            public void onPageFinished(WebView view, String url) {
                weburl=url;
                super.onPageFinished(view, url);
            }

        });
    }
    private void webViewSetting(){
        WebSettings webSettings = web_view.getSettings();
        // 让WebView能够执行javaScript
        webSettings.setJavaScriptEnabled(true);
        //是否允许访问文件
        webSettings.setAllowFileAccess(true);
        // 让JavaScript可以自动打开windows
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        // 设置缓存
        webSettings.setAppCacheEnabled(true);
        // 设置缓存模式,一共有四种模式
        webSettings.setCacheMode(webSettings.LOAD_CACHE_ELSE_NETWORK);
        // 支持缩放(适配到当前屏幕)
        webSettings.setSupportZoom(true);
        // 将图片调整到合适的大小
        webSettings.setUseWideViewPort(true);
        // 支持内容重新布局
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        // 设置可以被显示的屏幕控制
        webSettings.setDisplayZoomControls(true);
        // 设置默认字体大小
        webSettings.setDefaultFontSize(12);
        web_view.loadUrl(weburl);
    }
      //返回上一次浏览的页面
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            if (web_view.canGoBack()) {
                web_view.goBack();
                return true;
            } else {
                finish();
                return true;
            }

        }
        return false;
    }


}

activity_web.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".WebActivity">
<WebView
    android:id="@+id/web_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</RelativeLayout>

总结

希望对您有所帮助

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。