WebView的介绍与简单实现Android和H5互调的方法

yizhihongxing

介绍:

WebView是Andorid中提供的一种视图控件,它可以在应用中嵌入一个浏览器控件,并且可以开发者可以通过它来嵌套H5页面或者加载本地html文件,整合了nativ和webview,并且可以通过简单的代码实现两者之间的通信交互。在移动端中,WebView所扮演的作用非常重要,可以作为应用的嵌套控件,也可以用来作为轻量级的信息展示器。下面我们针对该控件进行进一步的讲解,并且介绍如何实现Andorid和H5互调的方法。

WebView的实现

  1. 引入WebView

在项目的build.graddle中加入如下代码:

allprojects {
    repositories {
        ......
    }
}

在要使用的activity中,添加如下代码:

<WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

2.在activity对webview进行操作

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = findViewById(R.id.webview);
        mWebView.loadUrl("https://www.baidu.com");
        mWebView.setWebViewClient(client);
        mWebView.setWebChromeClient(chromeClient);

    }
    public WebViewClient client = new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    };

    public WebChromeClient chromeClient = new WebChromeClient(){
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if(newProgress == 100){
                view.setVisibility(View.VISIBLE);
            }
        }
    };
}

Andorid和H5互调的方法

WebView提供了两种方法与H5相互调用的方式:

  1. JS 调用 Native 接口

Android 端需要提供一个 JS 接口类供 H5 调用,这个类需要继承自 Object 类,由于该类是运行在 JS 线程中的,所以它的方法需要被 @JavascriptInterface 标识。方法名可以任意命名,但是不容许重载:

public class WebAppInterface {
    private Context mContext;

    public WebAppInterface(Context context) {
        mContext = context;
    }

    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

Android 端在 WebView 中启动 H5 界面时,需要通过 setJavaScriptEnabled 方法设置启用 JavaScript:

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

H5 端调用 JS 接口,如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>调用Android原生Toast</title>
</head>
<body>
    <input type="button" value="调用Android原生Toast" onclick="showToast('这是Android原生Toast')"/>
    <script type="text/javascript">
        function showToast (string) {
            window.Android.showToast(string)
        }
    </script>
</body>
</html>
  1. Native 调用 JS 接口

使用 evaluateJavascript 方法,该方法可以在 WebView 中执行一段 JS 代码。需要注意的是,该方法在 Android 4.4 版本以下不可用,因此需要特殊处理:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.evaluateJavascript("javascript:showAndroidToast('这是来自Android代码')", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {
            Toast.makeText(mContext, value, Toast.LENGTH_SHORT).show();
        }
    });
} else {
    webView.loadUrl("javascript:showAndroidToast('这是来自Android代码')");
}

H5 端提供如下方法供 Native 调用:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>调用Android原生 Toast</title>
    <script type="text/javascript">
        function showAndroidToast(string) {
            alert(string);
        }
    </script>
</head>
<body>
</body>
</html>

示例1:

  • Android实现页面跳转与H5显示。
    Android侧代码:
public class MainActivity extends AppCompatActivity {
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient(){
            //覆盖shouldOverrideUrlLoading方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //解析url
                Uri uri = Uri.parse(url);
                //如果url的协议为wvjbscheme,说明是由JS调用的
                //因为前面已经拦截过一次,说明肯定是能够处理scheme的
                if(uri.getScheme().equals("wvjbscheme")){
                    if(uri.getHost().equals("baicai")){
                        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
                        startActivity(intent);
                        return true;
                    }
                    return false;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        String html = "<html><body><h1>HTML中的一个跳转页面</h1>" +
                "<p>点击下方按钮来调用我们的原生代码</p>" +
                "<p><button type=\"button\" onclick=\"javascript:window.baicai.gotoNative()\">跳转到原生界面</button></p>" +
                "</body></html>";
        webView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "UTF-8", null);
    }
}

H5侧代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>跳转页面</title>
    <script type="text/javascript">
        function gotoNative() {
            var url = "wvjbscheme://baicai/jump?title=跳转到百菜网";
            window.location.href = url;
        }
    </script>
</head>
<body>
<p>欢迎来到百菜网</p>
</body>
</html>
  • 设置Webview长按事件。
    Android侧代码:
public class MainActivity extends AppCompatActivity {
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    class JavaScriptInterface {
        private Context mContext;

        public JavaScriptInterface(Context c) {
            mContext = c;
        }

        @android.webkit.JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }

        @android.webkit.JavascriptInterface
        public void showLongToast(String toast){
            Toast.makeText(mContext, toast, Toast.LENGTH_LONG).show();
        }
    }

    private void initWebView(){
        webView = findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient(){
            //覆盖shouldOverrideUrlLoading方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
            @Override
            public void onPageFinished(WebView webView, String url){
                webView.loadUrl("javascript:document.body.contentEditable=true; void 0");
            }
        });
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

        String html = "<html><body><h1>HTML中的一个长按事件</h1>" +
                "<p long-pressable-on-android='true'>点击下方按钮来显示toast提示</p>" +
                "</body></html>";
        webView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "UTF-8", null);
    }
}

H5侧代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>长按事件</title>
    <script type="text/javascript">
        var pressTimer;
        var longPress = function() {
            window.Android.showLongToast("接收到一个长按事件");
        };
        document.querySelector('p.long-pressable-on-android')
            .addEventListener('mousedown', function(event) {
                pressTimer = window.setTimeout(longPress,3500);
            });
    </script>
</head>
<body>
<p>欢迎来到百菜网</p>
</body>
</html>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WebView的介绍与简单实现Android和H5互调的方法 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • win7系统设置网页背景颜色如绿色和豆绿色来保护眼睛

    请你先了解一下markdown的基本语法,以便于理解本文本中的标记和格式。首先,我们需要了解如何更改网页的背景颜色。在HTML中,可以通过设置CSS样式来实现此功能。因此,我们需要在网页head标签内添加一个style标签,并在其中设置相应的颜色值。以下是一个例子。 步骤一:打开Win7系统的控制面板 点击Win7系统的“开始”按钮,在“开始”菜单中选择“控…

    css 2023年6月9日
    00
  • CSS 网页文字渐变效果

    下面是CSS网页文字渐变效果的完整攻略,步骤如下: 步骤1:准备工作 在HTML文件中添加需要进行渐变效果的文字元素,例如: <h1>这里是需要进行渐变效果的标题</h1> 步骤2:使用CSS属性实现渐变 使用CSS的background-clip和-webkit-background-clip属性来实现文字颜色的渐变效果。其中,ba…

    css 2023年6月9日
    00
  • vue操作下拉选择器获取选择的数据的id方法

    下面是详细讲解 Vue 操作下拉选择器获取选择的数据的 id 方法的完整攻略。 1. 理解下拉选择器和获取选择数据的id 在 Vue 中,我们经常需要使用下拉选择器(Select)组件,这个组件提供了一种方便选择数据的方式,可以选择数据的名称,然后根据选择的数据名称获取数据的 id。获取数据的 id 对于后续的操作非常重要,一般用于保存数据或者进行其他的操作…

    css 2023年6月9日
    00
  • CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)

    关于“CSS 使用 resize 实现图片拖拽切换预览功能”的完整攻略,可以分为以下4步进行讲解: 1. HTML 结构准备 首先需要准备HTML结构,包括两个容器,一个用于显示图片的容器,另一个用于显示预览的容器。代码示例如下: <div class="image-container"> <img src="…

    css 2023年6月10日
    00
  • CSS背景图片固定宽高比自适应调整的实现方法

    下面我来详细讲解如何实现“CSS背景图片固定宽高比自适应调整”。 方法概述 在实现固定宽高比自适应调整的背景图片时,我们需要以下步骤: 设定元素的宽度,同时为了保持固定宽高比,为元素设置padding-top属性,值为百分比,通常为宽高比的倒数。 在CSS中设置元素的background-image属性,将图片作为元素的背景。 使用CSS中的backgrou…

    css 2023年6月9日
    00
  • CSS属性选择器的四种格式

    当开发者需要对页面中特定属性的元素进行样式设定时,就可以使用CSS属性选择器。CSS属性选择器可以根据元素的属性值或属性存在性来选择对应的元素进行样式设定。在CSS中,属性选择器有四种格式,分别是简单属性选择器、子串匹配选择器、属性值匹配选择器和属性值包含选择器。 简单属性选择器 简单属性选择器可以根据元素的某个特定属性的值选取对应元素进行样式的设定。下面是…

    css 2023年6月9日
    00
  • 网页设计中对于图片格式与设计关系的详解

    网页设计中对于图片格式与设计关系的详解攻略: 图片格式 常见的图片格式 在网页设计中,常见的图片格式有以下几种: JPEG(.jpg):支持色彩丰富的图片格式,适合存储照片和图像,可以设置图片的质量和大小。 PNG(.png):支持透明背景,不损失画质,可以制作带透明背景的小图标。 GIF(.gif):支持动图,可以制作小动画和简单的图标。 SVG(.svg…

    css 2023年6月9日
    00
  • 浅谈CSS响应式图片运用中的srcset属性

    下面是详细讲解关于“浅谈CSS响应式图片运用中的srcset属性”的完整攻略以及两个示例说明。 什么是响应式图片 响应式图片是指在不同设备上,自动调整图片大小以适应不同的屏幕和分辨率,从而提高用户体验和页面性能。网站设计师和开发人员可以使用响应式图片来根据设备屏幕大小和分辨率的不同,为不同的用户提供可视化的体验。 srcset 属性的运用 srcset 属性…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部