Android中WebView通过JavaScript调用Native方法

Android中WebView通过JavaScript调用Native方法

APP混合开发已经不是什么新鲜的事情了,在项目中的某些模块没有太多的体验交互,使用HTML、css、JavaScript来开发确实要比Native来的快一些。所以混合开发会成为一种趋势,而且web形式的开发部分在项目中占的比重会越来越重,特别是做外包、或者是交互性要求不是很高的项目。多Get一项技能总是没有错的,可以学习下web前端或者React Navitve来开发APP了。今天就通过JavaScript调用Navtive方法来介绍下WebView的简单使用。

第一步、编写HTML页面,包括所包含的JavaScript代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>JavaScript 调用 Native </title>
</head>
<body>
<input value="测试JavaScript调用Native方法" type="button" onclick="objectTest.showMessage('调用成功');">
</body>
</html>

objectTest是Native端提供的原生对象,showMessage(‘调用成功’)是调用的方法,后面会介绍。

第二步、编写原生对象

public class JavaScriptObject {
    @JavascriptInterface
    public void showMessage(String msg) {
        Toast.makeText(UiUtils.getContext(), msg, Toast.LENGTH_SHORT).show();
    }
}

第三步、在Activity.java中通过webView加载本地的HTML页面

多说一步,加载本地HTML页面的方法,HTML要放在与Java同级目录assets下面,如图
这里写图片描述

  • 方法一:
webView.loadUrl("file:///android_asset/javaScriptCallNative.html");
  • 方法二:

String dataString = getFromAssets("javaScriptCallNative.html");
webView.loadDataWithBaseURL(null, dataString, "text/html", "utf-8", null);

public String getFromAssets(String fileName) {
        try {
            InputStreamReader inputReader = new InputStreamReader(
                    getResources().getAssets().open(fileName));
            BufferedReader bufReader = new BufferedReader(inputReader);
            String line = "";
            String Result = "";
            while ((line = bufReader.readLine()) != null)
                Result += line;
            return Result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
  • activity.java完整代码
public class WebviewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);

        WebView webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("file:///android_asset/javaScriptCallNative.html");
        // String dataString = getFromAssets("javaScriptCallNative.html");
        // webView.loadDataWithBaseURL(null, dataString, "text/html", "utf-8", null);

        /**
         *  webView调用Android中的方法步骤
         *  1。WebSettings的setJavaScriptEnabled 设置为true
         *  2. addJavascriptInterface(Object obj, String name) 将对象暴露给JavaScrit
         *  3、在JavaScript脚本中通过name对象调用Android方法
         */
        WebSettings settings = webView.getSettings();
        // 设置webView可以使用JavaScript
        settings.setJavaScriptEnabled(true);
        // 将对象暴露给JavaScript脚本(此处的name参数‘objectTest’一定要和JavaScript定义的相同)
        webView.addJavascriptInterface(new JavaScriptObject(), "objectTest");

        // 设置监听(webView中HTML加载的进度、标题等)
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                Log.e("onProgressChanged", "进度改变 = " +  newProgress);
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                Log.e("onReceivedTitle", "收到标题 = " +  title);
                super.onReceivedTitle(view, title);
            }
        });

        // 设置监听(页面加载情况)
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.e("Loading", "shouldOverrideUrlLoading");
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.e("onPageFinished", "加载完成");
                super.onPageFinished(view, url);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                Log.e("onPageStarted", "开始加载");
                super.onPageStarted(view, url, favicon);
            }
        });
    }

    private String getFromAssets(String fileName) {
        try {
            InputStreamReader inputReader = new InputStreamReader(
                    getResources().getAssets().open(fileName));
            BufferedReader bufReader = new BufferedReader(inputReader);
            String line = "";
            String Result = "";
            while ((line = bufReader.readLine()) != null)
                Result += line;
            return Result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

第四步、运行程序,查看效果

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,关于Android webview调用react ts方法的具体实现方法示例,可以通过以下步骤实现: 1. 在react ts项目,使用window对象将需要调用方法暴露出来,例如: window.myMethod = function() { // do something } 2. 在Android webview,使用addJavascriptInterface方法将Java对象暴露给JavaScript,例如: webView.addJavascriptInterface(new MyJavaObject(), "myJavaObject"); 3. 在JavaScript,通过window对象调用Java对象的方法,例如: window.myJavaObject.myJavaMethod(); 4. 在Java对象,实现需要调用方法,例如: public class MyJavaObject { @JavascriptInterface public void myJavaMethod() { // do something } } 希望以上步骤能够帮助您实现Android webview调用react ts方法。 ### 回答2: 在Android,要调用React Native的ts方法,需要经过一系列步骤。以下是一个示例: 1. 首先,确保Android项目已经集成了React Native。可以通过插件或手动集成的方式来实现。 2. 在React Native,编写一个含有你需要调用的ts方法的组件。例如,你可以创建一个名为"ExampleComponent"的组件,在该组件定义一个名为"exampleMethod"的ts方法。 3. 在Android项目的Java文件,创建一个WebViewClient的子类。例如,你可以创建一个名为"CustomWebViewClient"的类。 4. 在"CustomWebViewClient"类,重写WebViewClient的shouldOverrideUrlLoading方法。在该方法,判断WebView加载的URL是否为你想要调用的React Native组件所在的URL。如果是,就执行具体的调用。 ```java class CustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.equals("your/react/component/url")) { // 执行React Native的ts方法 ExampleComponent exampleComponent = new ExampleComponent(); exampleComponent.exampleMethod(); return true; } return super.shouldOverrideUrlLoading(view, url); } } ``` 5. 在Activity,创建一个WebView,并将"CustomWebViewClient"设置为其WebViewClient。如下所示: ```java WebView webView = findViewById(R.id.webview); webView.setWebViewClient(new CustomWebViewClient()); webView.loadUrl("your/webpage/url"); ``` 6. 最后,在React Native,确保你将"ExampleComponent"组件导出为Module。具体的导出方式取决于你使用的React Native版本。 以上就是使用Android WebView调用React Native的ts方法的示例实现方法。通过重写WebViewClient的shouldOverrideUrlLoading方法,我们可以根据WebView加载的URL来判断是否需要调用React Native方法,并执行相应的操作。 ### 回答3: 具体实现方法示例如下: 1. 首先,在React TS项目创建一个类组件,例如: ```tsx import React from 'react'; class MyComponent extends React.Component { myMethod() { // 执行某个操作 } render() { return ( <div> // 组件的内容 </div> ); } } export default MyComponent; ``` 2. 在AndroidWebView加载React TS项目的页面,例如: ```java WebView webView = findViewById(R.id.webview); WebViewClient webViewClient = new WebViewClient(); webView.setWebViewClient(webViewClient); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/index.html"); ``` 3. 在React TS项目的index.html页面,编写JavaScript代码来调用MyComponent组件方法,例如: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>React App</title> <!-- 加载React TS项目生成的JavaScript文件 --> <script src="main.js"></script> </head> <body> <div id="root"></div> <script> // 调用MyComponent组件方法 document.addEventListener("DOMContentLoaded", function() { var rootElement = document.getElementById("root"); ReactDOM.render(React.createElement(MyComponent), rootElement); // 调用myMethod方法 var myComponentInstance = rootElement._reactRootContainer._internalRoot.current.child.stateNode; myComponentInstance.myMethod(); }); </script> </body> </html> ``` 通过以上实现,AndroidWebView可以加载React TS项目页面,并且通过JavaScript代码调用React组件方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值