安卓使用webview中与JS相互传递数据

安卓在使用webview过程中,常常要与js间进行通信。这次我做了简单的总结,如下。

一、js传递数据给安卓端:

主activity,

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;

   private String url = "http://wechat-dev.cb3dp.com/testwebview.html";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = findViewById(R.id.webview);
        initWebView();
    }

    private void initWebView() {
        WebSettings settings = mWebView.getSettings();

        //settings.setUseWideViewPort(true);//调整到适合webview的大小,不过尽量不要用,有些手机有问题
        settings.setLoadWithOverviewMode(true);//设置WebView是否使用预览模式加载界面。
        mWebView.setVerticalScrollBarEnabled(false);//不能垂直滑动
        mWebView.setHorizontalScrollBarEnabled(false);//不能水平滑动
        settings.setTextSize(WebSettings.TextSize.LARGEST);//通过设置WebSettings,改变HTML中文字的大小
        settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
        //设置WebView属性,能够执行Javascript脚本
        mWebView.getSettings().setJavaScriptEnabled(true);//设置js可用
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.addJavascriptInterface(new AndroidJavaScript(getApplication()), "android");//设置js接口
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//支持内容重新布局

//        mWebView.loadDataWithBaseURL(url, null, "text/html", "utf-8", null);

        mWebView.loadUrl(url);


    }


    /**
     * AndroidJavaScript
     * 本地与h5页面交互的js类,这里写成内部类了
     * returnAndroid方法上@JavascriptInterface一定不能漏了
     */
    private class AndroidJavaScript  {
        Context mContxt;

        public AndroidJavaScript (Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface
        public void returnAndroid(String name) {//从网页跳回到APP,这个方法已经在上面的HTML中写上了
            if (name.isEmpty()||name.equals("")){
                return ;
            }
            Toast.makeText(getApplication(),name,Toast.LENGTH_SHORT).show();
            //这里写你的操作///
            //MainActivity就是一个空页面,不影响
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("name",name);
            startActivity(intent);
        }
    }

}

html,


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

</head>
<body>
<style>
img{ width:100% !important;}
</style>
<img src="https://ss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/dd9d1d686cdc814db9653b254e00402e_259_194.jpg" alt="" />
<p style="text-align:right;">品类定位的思考</p>
<h3>
<strong>
<span style=\"color:#00D5FF;\">品类定</span>
</strong>
<h3>
<a href='JavaScript:android.returnAndroid("要返回给APP的数据")'>点击我跳回APP</a>
</body>
</html>

主要的方法,就是js端 调用安卓端声明的方法,JavaScript:android.returnAndroid("要返回给APP的数据") 以及安卓端抛出的方法,具体请看  AndroidJavaScript类,

二、安卓端传数据到js端

主activity

public class SecondActivity extends AppCompatActivity {
    private TextView tv;
    private WebView mWebView;

//    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        tv = findViewById(R.id.tv);

        mWebView = findViewById(R.id.webview);

        String name = getIntent().getStringExtra("name");
        if (!TextUtils.isEmpty(name)){
            tv.setText(name);
        }

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setSavePassword(false);
        webSettings.setSaveFormData(false);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);

        mWebView.setWebChromeClient(new MyWebChromeClient());

//        mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

        mWebView.loadUrl("http://wechat-dev.cb3dp.com/testwebview2.html");

        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mWebView.loadUrl("javascript:javaCall('fasff')");
            }
        });
    }

    /**
     * Provides a hook for calling "alert" from javascript. Useful for
     * debugging your javascript.
     */
    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d("TAG", message);
            result.confirm();

            tv.setText(message);
            return true;
        }
    }

}

html,

<html>  

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



<script language="javascript">  
   
    function javaCall(str){  
		
       //lat = window.demo.GetLat(); 	
		alert("11111")
		document.getElementById("btn").value = str;
    }  
  
</script>  

</head>

<body οnlοad="initialize()">  
<!-- Calls into the javascript interface for the activity -->  
<!--<a id="btn_test" onClick="window.demo.clickOnAndroid(lat)">  -->
    <div style="width:80px;  
            margin:0px auto;  
            padding:10px;  
            text-align:center;  
            border:2px solid #202020;" >  
    Click me!  
    </div>  
	
	<input id = "btn" type="button" value="按钮"/>
</a>  
</body>  
</html>  

这个比上面那个要简单些,只需要js 声明方法,然后安卓直接调用即可, mWebView.loadUrl("javascript:javaCall('fasff')");

项目下载地址


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值