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日

相关文章

  • IE下使用form时所在行被撑高的解决方法

    IE浏览器在渲染form表单元素时,可能会出现表单所在行被撑高的现象,这主要是由于IE会为表单自动添加display: inline-block;的样式导致的。下面提供两种解决方式,以便在IE中使用form表单元素不会影响页面布局。 方式一:使用vertical-align 将form表单元素和其所在的元素都设置为vertical-align: top;的样…

    css 2023年6月9日
    00
  • css重绘与重排的方法

    当我们在开发网站时,如果使用了CSS样式表进行样式布局,那么在浏览器渲染页面时,会按照以下流程进行渲染: 解析HTML文档,创建DOM树; 解析CSS样式,生成CSS规则树; 将DOM树和CSS规则树合并,生成渲染树; 对渲染树进行布局,计算每个元素的大小和位置等信息; 对渲染树进行绘制,将元素渲染到页面上。 在这个过程中,当我们修改了DOM树或者CSS样式…

    css 2023年6月9日
    00
  • css3的focus-within选择器的使用

    CSS3的focus-within选择器用于选取一个元素的所有后代元素中,只要其中一个获得焦点,该元素就会被选中。它的语法如下: selector:focus-within { /* CSS样式 */ } 在使用该选择器时,首先需要有一个具有焦点行为的元素,例如<input>标签或<button>标签。然后,我们可以使用focus-w…

    css 2023年6月9日
    00
  • Webstorm开发工具使用教程详解

    WebStorm开发工具使用教程详解 WebStorm是一款由JetBrains公司开发的JavaScript集成开发环境(IDE),集成了丰富的Javascript开发工具,如调试、代码智能提示、版本控制、代码重构等功能。本文将详细讲解WebStorm开发工具的使用方法。 安装WebStorm 下载Webstorm软件包,并按照指引安装到本地计算机上。 创…

    css 2023年6月9日
    00
  • DIV始终浮动在页面底部

    要实现“DIV始终浮动在页面底部”,有以下几种方法: 1. 使用绝对定位 通过将DIV的position属性设为absolute,并将bottom属性设为0,可以将DIV固定在页面底部。示例代码如下: #bottom-div { position: absolute; bottom: 0; width: 100%; height: 50px; /* 注意要设…

    css 2023年6月10日
    00
  • calc()实现满屏背景定宽内容

    要实现“calc()实现满屏背景定宽内容”的效果,需要进行如下步骤: 1. 使用calc()计算内容区域宽度 我们可以使用calc()进行宽度计算,计算的公式为:100% – 定宽内容区域宽度。例如,如果我们需要固定内容区域宽度为800px,那么公式就是:calc(100% – 800px)。 2. 设置内容区域的宽度 使用上一步计算好的数值,将其作为内容区…

    css 2023年6月9日
    00
  • jquery获取css中的选择器(实例讲解)

    下面是“jquery获取css中的选择器(实例讲解)”的完整攻略: 1. 使用jQuery获取CSS中的选择器 要使用jQuery获取CSS中的选择器,我们需要依赖jQuery的$.cssRules()方法。这个方法可以返回一个包含所有CSS规则的数组,包括每条规则的选择器名称和样式。 例如,我们有如下的CSS规则: h1 { color: red; } p…

    css 2023年6月9日
    00
  • 网站模型设计中的内涵和重点

    网站模型设计是指在开发一个网站之前,需要通过分析用户、业务和技术等需求,构建出网站的整体框架和功能结构,从而为后续的网站开发工作奠定基础。在网站模型设计中,有许多内涵和重点需要注意,下面我将详细讲解网站模型设计中的完整攻略。 确定网站模型设计的目标和范围 在网站模型设计的初期,需要明确网站的目标和范围。目标是指网站的宏观需求,如网站的定位和用户需求等。范围是…

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