Android WebView与js交互

今天在网上看到一个js写的抽奖大转盘,觉得很有意思,就像把他集成到安卓里
在这里插入图片描述
需求:在App里用webview加载大转盘网址,转盘停止之后通过js回调本地方法把结果传递到App中,App弹窗显示,需要两个技术

1:用webview加载地址
2:通过webview和js交互

那么我们就来写一下吧 在项目中新建DrawActivity页面

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:background="@color/error_color_material_dark"
    tools:context=".ui.activity.DrawActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_marginTop="@dimen/x21"
        app:title="每日一抽"
        app:titleTextColor="@color/white"
        android:background="@color/error_color_material_dark"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v7.widget.Toolbar>

    <WebView
        android:id="@+id/mWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
      />


</LinearLayout>

很简单,一个Toolbar一个Webview

Java代码

package com.lingjuan.app.ui.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

import com.jaeger.library.StatusBarUtil;
import com.lingjuan.app.R;
import com.lingjuan.app.base.BaseActivity;
import com.lingjuan.app.constant.Constant;
import com.lingjuan.app.utils.DialogUtil;
import com.lingjuan.app.utils.ToastManage;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * 抽奖页面
 * data: 2019/2/26 15:04
 */
public class DrawActivity extends BaseActivity {

    @BindView(R.id.mWebView)
    WebView mWebView;
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    private JsInterface jsInterface;
    private boolean conduct = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StatusBarUtil.setTranslucentForImageView(this, getResources().getColor(R.color.error_color_material_dark), null);
        setContentView(R.layout.activity_draw);
        ButterKnife.bind(this);
        initView();
        initData();
    }

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void initView() {
        jsInterface = new JsInterface();
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        WebSettings webSettings = mWebView.getSettings();
        // 设置android下容许执行js的脚本
        webSettings.setJavaScriptEnabled(true);
        //允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        //添加JS交互 第一个参数是类  里面写上回调的方法  第二个参数是js调用的用户名
        mWebView.addJavascriptInterface(jsInterface, "jsApp");
        //加载地址
        mWebView.loadUrl(Constant.HTTP_DRAW);
        toolbar.setNavigationOnClickListener(v -> {
            if (!conduct) {
                ToastManage.showText(getActivity(), "大转盘正在进行,请停止后在关闭");
                return;
            }
            finish();
        });
        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if(title != null){
                    //获取网页标题
                    toolbar.setTitle(String.valueOf(title));
                }
            }
        });
    }

    @Override
    protected void initData() {

    }

    @Override
    protected int getLayout() {
        return R.layout.activity_draw;
    }

    @Override
    protected Activity getActivity() {
        return this;
    }


    private class JsInterface {
        @JavascriptInterface
        public void getdrawResults(String str) {
            conduct = true;
            DialogUtil.showDialog(getActivity(), str, "知道了", null);
        }

        @JavascriptInterface
        public void getStare() {
            conduct = false;
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (!conduct) {
                ToastManage.showText(getActivity(), "大转盘正在进行,请停止后在关闭");
            }else {
                finish();
            }
        }
        return false;
    }
}

大转盘部分代码

$('.pointer').click(function (){
    //开始的时候调用客户端方法  其中jsApp为App中传递过来的参数名getStare为方法
    window.jsApp.getStare();
	if(turnplate.bRotate)return;
	turnplate.bRotate = !turnplate.bRotate;
	//获取随机数(奖品个数范围内)
    var num = Math.round(Math.random()* 100); //获取100之内的任意一个整数;
    if(num < 5){
        item = 0;
    }else if(num > 5 && num < 20){
        item = rnd(1,2);
    }else if(num > 20 && num < 60){
        item = rnd(3,5);
    }else {
        item = 6;
    }

    rotateFn(item, turnplate.restaraunts[item]);
});
var rotateFn = function (item, txt){
	var angles = item * (360 / turnplate.restaraunts.length) - (360 / (turnplate.restaraunts.length*2));
	if(angles<270){
		angles = 270 - angles; 
	}else{
		angles = 360 - angles + 270;
	}
	$('#wheelcanvas').stopRotate();
	$('#wheelcanvas').rotate({
		angle:0,
		animateTo:angles+2100,
		duration:5000,
		callback:function (){
			console.log(txt);
			turnplate.bRotate = !turnplate.bRotate;
			//结束时候调用结束方法并且传参过去 App中弹出Dialog
            window.jsApp.getdrawResults(txt);
		}
	});
};

我们来看一下最终效果
在这里插入图片描述
App下载地址:http://suo.im/4qDcGT
项目地址:https://github.com/CrackgmKey/Bearbear (DrawActivity页面)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android WebView 是一个能够在 Android 应用程序中嵌入网页的组件,它可以开发出能够与 Web 页面进行交互的应用。其中与 Web 页面进行交互的一种方法是与 JavaScript 进行交互。下面简要解释一下 Android WebViewJS 交互的方式。 1. 加载本地 HTML 文件 在 Android WebView 中加载本地 HTML 文件时,需要使用 loadUrl() 方法加载。HTML 文件中的 JavaScript 可以通过 WebView 提供的 addJavascriptInterface() 方法注册为 Java 中的一个对象,然后在 Java 中调用该对象的方法,即可实现 JS 与 Java 的交互。 2. 加载远程 Web 页面 在 Android WebView 中加载远程 Web 页面时,需要添加 WebViewClient 和 WebChromeClient,分别是用来管理 WebView 的网络请求和处理页面上的 JavaScript 弹窗等请求。 在远程 Web 页面上,JS 代码可以通过 WebView 提供的 addJavascriptInterface() 方法注册为 Java 中的一个对象,然后在 Java 中调用该对象的方法,即可实现 JS 与 Java 的交互。 同时,在 Android 中处理 JS 的事件需要通过 JavaScriptInterface 向 WebView 注册一个映射对象,来实现 JS、Java 相互调用的机制,静态 HTML 文件是通过 WebView 中的 evaluateJavascript() 方法来调用 JS,来实现双向通信和数据交互。 总结来说,Android WebViewJS 交互的方式主要是通过 WebView 提供的 addJavascriptInterface() 方法注册为 Java 中的一个对象,然后在 Java 中调用该对象的方法,来实现 JS 和 Java 的交互。同时,JS 也可以通过 WebView 的 evaluateJavascript() 方法来调用 Java 中的方法,实现双向通信和数据交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值