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

介绍:

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日

相关文章

  • 一样的table?不一样的table(可编辑状态table)

    一、一样的table? 在网页设计中,我们常常需要展示大量的数据,而传统的数据展示方式往往是使用表格。表格可以让数据更加井然有序地呈现出来,更容易阅读和理解。但在实际设计过程中,我们往往需要对表格进行一些定制化的设计,比如调整表头样式、改变单元格背景色等等,这就要求我们能够将表格进行灵活的排版和格式化。 对于简单的表格,我们可以通过 HTML 标签和 CSS…

    css 2023年6月10日
    00
  • bootstrap读书笔记之CSS组件(上)

    Bootstrap读书笔记之CSS组件(上) 什么是CSS组件 一套基于语义化的、可重用的、跨浏览器的HTML/CSS常规设计 不需要增加Javascript即可进行交互 用于语意化地描述UI元素的外观和行为 CSS组件的主要类 基础文本元素 h1~h6 p mark small del s ins u strong em 链接 a abbr address…

    css 2023年6月9日
    00
  • jQuery实现字体颜色渐变效果的方法

    关于“jQuery实现字体颜色渐变效果的方法”的完整攻略,我可以这么说: 一、前言 在网页设计中,颜色渐变(Color Gradient)是一种流行的设计元素,可以使网页更加动态和吸引人。而使用jQuery来实现颜色渐变效果,则可以更加灵活和易用。 二、jQuery实现字体颜色渐变效果的方法 实现字体颜色渐变效果的方法,主要可以通过jQuery的animat…

    css 2023年6月11日
    00
  • html5简介_动力节点Java学院整理

    HTML5简介 什么是HTML5? HTML5是HTML最新的一个版本,它不仅仅是HTML标准的最新版本,还包括了诸多前端技术,如CSS3、JavaScript等。HTML5的出现,使得构建更丰富、更多样的Web内容变得更加容易。 HTML5的新特性 新语义元素 HTML5引入新的语义元素,可以更加清晰的描述Web内容的结构,例如: <header&g…

    css 2023年6月10日
    00
  • CSS 实现元素较宽不能被完全展示时将其隐藏的方法

    实现元素较宽不能被完全展示时将其隐藏的方法有很多种,其中被广泛应用的方式是利用 CSS 的 overflow 属性。 具体的实现方法如下: 使用 overflow 属性。 在 CSS 中,可以通过设置元素的 overflow 属性来实现元素较宽不能被完全展示时将其隐藏的功能。在 overflow 中,常用的取值有 hidden、scroll、auto 等。其…

    css 2023年6月10日
    00
  • JS+CSS实现仿msn风格选项卡效果代码

    下面是详细讲解“JS+CSS实现仿msn风格选项卡效果代码”的完整攻略,包含以下几个步骤: 1. HTML结构 首先,我们需要在HTML中定义选项卡的基本结构,通常采用<ul>和<li>来表示。具体代码如下: <ul class="tabnav"> <li class="active&q…

    css 2023年6月10日
    00
  • css弹性盒flex-grow、flex-shrink、flex-basis详解

    我们来详细讲解一下 CSS 弹性盒子模型中的 flex-grow、flex-shrink 和 flex-basis 属性。 弹性盒子模型介绍 CSS 弹性盒子模型(Flexbox)是一种基于浏览器的布局模式,使开发人员可以更加方便、灵活地设计和排列元素。通过指定容器中的弹性盒子的布局方式、方向、对齐方式、大小等属性,可以实现各种复杂的布局效果。 flex-g…

    css 2023年6月10日
    00
  • web标准常见问题集合4

    让我来为你详细讲解“web标准常见问题集合4”的完整攻略。 1. 什么是web标准常见问题集合4? “web标准常见问题集合4”指的是前端开发过程中,常见的一些web标准问题。该集合包含了部分HTML、CSS和JavaScript的语言规范及实现时的注意事项,旨在帮助开发者提高代码的可读性、可维护性、可扩展性,并提升用户体验。 2. HTML部分 2.1. …

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