JS与Native交互

文章参考

demo示例

在这里插入图片描述

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

assets下的本地html
在这里插入图片描述

<html>

	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

		<script type="text/javascript">
			function nativeUseJs(){
				document.getElementById("id_tv_js_show").innerHTML += "<br\>Native调用了js方法";
			}

			function nativeUseJsWithParam(arg){
				document.getElementById("id_tv_js_show").innerHTML += ("<br\>Native调用了js方法并传递参数:" + arg);
			}
		</script>

	</head>



	<body>
		<p>WebView界面</p>

		<div>
			<button onClick="window.zlz.jsUseNative()">JS调用Native方法</button>
		</div>

		<br/>

		<div>
			<button onClick="window.zlz.jsUseNativeWithParam('JS的参数')">JS调用Native方法并传递参数</button>
		</div>

		<br/>

		<div id="id_tv_js_show">Native调用js方法打印信息...</div>

	</body>

</html>

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">


    <WebView
        android:id="@+id/id_webView"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Android Native界面"
        android:textColor="@android:color/white"
        android:textSize="20dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_webView" />


    <TextView
        android:id="@+id/id_btn_native_use_js"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="30dp"
        android:background="@android:color/darker_gray"
        android:gravity="center_horizontal"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:text="Native调用js方法"
        android:textColor="@android:color/white"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_webView" />

    <TextView
        android:id="@+id/id_btn_native_use_js_param"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="30dp"
        android:background="@android:color/darker_gray"
        android:gravity="center_horizontal"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:text="Native调用js方法并传值"
        android:textColor="@android:color/white"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_btn_native_use_js" />


    <TextView
        android:id="@+id/id_tv_native_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:paddingTop="10dp"
        android:text="Js调用Native方法打印信息..."
        android:textColor="@android:color/white"
        android:textSize="20dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_btn_native_use_js_param" />

</androidx.constraintlayout.widget.ConstraintLayout>

Activity.class

public class JsNativeActivity extends AppCompatActivity {

    private WebView webView;

    private TextView btn_native_use_js;
    private TextView btn_native_use_js_param;
    private TextView tv_native_show;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_js_native);
        initView();
        initWebView();
    }

    /**
     * 初始化界面控件
     */
    private void initView() {
        btn_native_use_js = findViewById(R.id.id_btn_native_use_js);
        btn_native_use_js_param = findViewById(R.id.id_btn_native_use_js_param);
        tv_native_show = findViewById(R.id.id_tv_native_show);
    }

    /**
     * 初始化 webView
     */
    @SuppressLint("JavascriptInterface")
    private void initWebView() {
        webView = findViewById(R.id.id_webView);
        //启用javaScript
        webView.getSettings().setJavaScriptEnabled(true);
        //从assets目录下加载html
        webView.loadUrl("file:///android_asset/js.html");
        webView.addJavascriptInterface(new JsNativeActivity.JsInterface(), "zlz");

        btn_native_use_js.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.loadUrl("javascript:nativeUseJs()");
            }
        });

        btn_native_use_js_param.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.loadUrl("javascript:nativeUseJsWithParam(" + "'Native的参数'" + ")");
            }
        });
    }


    /**
     * Js 调用 Native 方法
     */
    class JsInterface {
        @JavascriptInterface
        public void jsUseNative() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String str = tv_native_show.getText().toString().trim();
                    tv_native_show.setText(str + "\n" + "JS调用Native方法");
                }
            });
        }

        @JavascriptInterface
        public void jsUseNativeWithParam(final String msg) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String str = tv_native_show.getText().toString().trim();
                    tv_native_show.setText(str + "\n" + "JS调用Native方法并传递参数 : " + msg);
                }
            });
        }
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KillerNoBlood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值