Android WebView常见问题

简介: 本文主要介绍了在Android开发中WebView的使用方法,包括加载网址、设置相关属性(如JavaScript支持、缓存模式、屏幕适配等)、监听网页加载过程以及返回上一页面的功能实现。同时针对Android P版本限制明文流量的问题(ERR_CLEARTEXT_NOT_PERMITTED),提供了在`AndroidManifest.xml`中添加`android:usesCleartextTraffic="true"`的解决办法。文章还附有完整代码示例,帮助开发者快速上手并解决常见问题。希望对您的开发工作有所帮助!

前言

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

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

一、webview的简单使用

1.load网址

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

如果你是真机调试,且手机系统比较高的话,应该会报错:网页无法加载,应为: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);
AI 代码解读

这里就只介绍本例子用的一些属性了,如需了解更多,请前往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);
            }

        });
AI 代码解读

这里主要介绍三个方法

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;
    }
AI 代码解读

二、遇到的一些问题

1.ERR_CLEARTEXT_NOT_PERMITTED

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

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

android:usesCleartextTraffic="true"
AI 代码解读

2.便页面支持缩放

WebSettings webSettings =web_view.getSettings();       
webSettings.setJavaScriptEnabled(true);  
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);
AI 代码解读

3.自适应屏幕

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

三、源码

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;
    }


}
AI 代码解读

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>
AI 代码解读

总结

希望对您有所帮助

相关文章
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
云效产品使用常见问题之打包后的Android应用获取下载地址失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
mPaaS常见问题之Android集成dexPatch热修复运行时候无法正常进行热更新如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
180 0
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
123 15
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
133 2
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
268 0
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
1237 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等