Android调用 Webview的JS方法

缘由

最近准备开发几个小的APP玩玩,但自己最擅长的可能算是前端的东西吧!这就想到了H5开发,之前有老师和我聊过,就尝试弄了一下;当然H5开发有各种开发的框架比如Flutter等等,我这里是用的原生的Webview;

代码

html设置

在src/main/下创建一个文件夹assets,注意名称,我第一次运行不了看日志才发现这个问题;

  • 在里面创建一个javascript.html文件,内容如下:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>emperinter</title>

    <div align="center">
        <p>I Love <a id="name"> You !</a></p>
        <P>Date:<a id="demo">now!</a></P>
        <button>button</button>
    </div>
    <script>
    // Android需要调用的方法
   function callJS(){
      alert("Android调用了JS的callJS方法");
   }

   function ChangeName(InputName){
        document.getElementById("name").innerHTML= InputName;
        return InputName;
   }

   function callJS_val(val){
      alert(val);
   }
</script>
</head>
</html>

布局

布局如下:

  • 代码
    > 仅供参考,按需修改!
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TableLayout
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:layout_marginStart="1dp"
        android:layout_marginLeft="1dp"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginBottom="1dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <WebView
                android:id="@+id/Main_webview"
                android:layout_width="420dp"
                android:layout_height="337dp" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <Button
                android:id="@+id/Main_button"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@string/Mian_button" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <EditText
                android:id="@+id/MainText0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="textPersonName"
                android:text="Name" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <Button
                android:id="@+id/Main_button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
        </TableRow>

    </TableLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

java

public class MainActivity extends AppCompatActivity {
    WebView mwebview;
    Button mbutton;
    Button mbutton1;
    EditText medittext;

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

        //实例化
        mwebview = (WebView) findViewById(R.id.Main_webview);
        mbutton = (Button) findViewById(R.id.Main_button);
        mbutton1 = (Button) findViewById(R.id.Main_button1);
        medittext = (EditText) findViewById(R.id.MainText0);

        WebSettings webSettings = mwebview.getSettings();

        // 设置与Js交互的权限
        webSettings.setJavaScriptEnabled(true);
        // 设置允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        // 先载入JS代码
        // 格式规定为:file:///android_asset/文件名.html
        mwebview.loadUrl("file:///android_asset/javascript.html");
        Log.e("webload","html load successful !\n\n\n\n\n\n");

        //Button事件监听
        mbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 通过Handler发送消息
                mwebview.post(new Runnable() {
                    @Override
                    public void run() {

                        // 注意调用的JS方法名要对应上
                        // 调用javascript的callJS()方法
                        mwebview.loadUrl("javascript:callJS()");
                        Log.e("js调用:","0k!\n\n\n\n\n\n\n\n\n\n\n\n");
                    }
                });
            }
        });

        mbutton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mwebview.post(new Runnable() {
                    @SuppressLint("NewApi")
                    @Override
                    public void run() {

                        String str = medittext.getText().toString();

                        try {
                            // 只需要将第一种方法的loadUrl()换成下面该方法即可
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                                mwebview.evaluateJavascript("javascript:ChangeName('" + str + "')", new ValueCallback<String>() {
                                    @Override
                                    public void onReceiveValue(String value) {
                                        //此处为 js 返回的结果
                                        Log.e("js调用change_name:","0k!\n\n\n\n\n" + value + "\n\n\n\n\n\n\n");
                                    }
                                });
                            }else{
                                mwebview.loadUrl("javascript:ChangeName('" + str +"')");
                                //如何传参???
                                //传参是传进去了,但页面没有任何变化。
                                Log.e("ChangeName0",str + "\n\n\n\n\n");
                            }
                        }catch (Exception ex){
                            Log.e("ChangeName Exception",":" + ex);
                        }
                    }
                });
            }
        });

        // 由于设置了弹窗检验调用结果,所以需要支持js对话框
        // webview只是载体,内容的渲染需要使用webviewChromClient类去实现
        // 通过设置WebChromeClient对象处理JavaScript的对话框
        //设置响应js 的Alert()函数
        mwebview.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);
                b.setTitle("Alert");
                b.setMessage(message);
                b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        result.confirm();
                    }
                });
                b.setCancelable(false);
                b.create().show();
                return true;
            }

        });
    }
}

样例图


参考


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *