• androidWebView详解实例(JavaScript调用Java方法,Java调用JavaScript方法)


    • 静态页-test.html(放在assets跟目录下):

    <!DOCTYPE html>

    <html>

    <head>

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

    <meta name="viewport"

    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

    <title>android WebView test</title>

    <script type="text/javascript">

         function callJavaMethod(obj){

        //android_interface为Java提供的调用接口名称(Java代码中红色标注

        window.android_interface.javaMethod(obj.value); 

         }

         function show(msg){

        alert(msg);

         }

        </script>

    </head>

    <body style="background: gray;">

    <p>

    <a href="javascript:window.android_interface.javaMethod('hi msg from javascript!')">call java method </a>

    <br />

    <a href="http://www.baidu.com">百度一下</a>

    </p>

    <div id="container">

    <input type="button" id="btn" value="点击我调用Java方法:)" onClick="javascript:callJavaMethod(this);" />

    </div>

    </body>

    </html>

     

    • Activity类SliderEpubActivity.java:

    package com.innover.ebook;

     

    import java.util.Date;

     

    import android.annotation.SuppressLint;

    import android.app.Activity;

    import android.os.Bundle;

    import android.os.Handler;

    import android.webkit.JsResult;

    import android.webkit.WebChromeClient;

    import android.webkit.WebSettings;

    import android.webkit.WebView;

    import android.webkit.WebViewClient;

    import android.widget.Toast;

     

    @SuppressLint("SetJavaScriptEnabled")

    public class SliderEpubActivity extends Activity {

     

    private static final String TAG="SliderEpubActivity";

    private Handler handler;

    private WebView myWebView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    initView();

    setContentView(myWebView);

    setData2WebView();

    }

       

    private void initView(){

     

        myWebView=new WebView(this);

        handler=new Handler();

        setSupportJavaScript();

        setInterface4JavaScript();

        setWebViewClient();

        setWebViewChromeClient();

     

    }

    private void setData2WebView(){

         myWebView.loadUrl("file:///android_asset/test.html");

    }

    /**

    * 设置WebView对象支持javascript

    */

    private void setSupportJavaScript(){

        WebSettings set = myWebView.getSettings();

        set.setJavaScriptEnabled(true);

    }

    /**

    * 添加java方法的调用接口,允许javascript脚本调用java方法

    */

    private void setInterface4JavaScript(){

    myWebView.addJavascriptInterface(new Object() {

    //这里的方法是随意添加的

    public void javaMethod(final String argsFromJavaScript) {

                 handler.post(new Runnable() {

                     @Override

                     public void run() {

                         showMsg("["+new Date()+"] 消息来自HTML页面:"+argsFromJavaScript);

                     }

                 });

             }

        }, "android_interface");//Javascript通过“android_interface”调用Java方法

     

    }

    /**

    * WebView中链接的跳转

    * WebViewClient主要帮助WebView处理各种通知、请求事件

    */

    private void setWebViewClient(){

    myWebView.setWebViewClient(new WebViewClient(){

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        showMsg(url);

       //直接在当前WebView中加载url

        view.loadUrl(url);

        return true;

        //return super.shouldOverrideUrlLoading(view, url);

    }

     

    //当页面加载完成时调用Javascript方法

    @Override

    public void onPageFinished(WebView view, String url) {

    super.onPageFinished(view, url);

        callJavascriptMethod();

    }

    });

    }

    /**

    * 调用页面中的javascript方法

    */

    private void callJavascriptMethod(){

        myWebView.loadUrl("javascript:show('我是activity传过来的数据')"); 

    }

    /**

    * 处理WebView加载网页弹出的对话框

    */

    private void setWebViewChromeClient(){

    myWebView.setWebChromeClient(new WebChromeClient(){

    @Override

        public boolean onJsAlert(WebView view, String url, 

                                 String message,JsResult result) {

              showMsg(message);

              //此处应该调用super的onJsAlert,否则内容无法加载,页面将显示空白

              return super.onJsAlert(view, url, message, result);

         }

    });

     

    }

    private void showMsg(String msg) {

         Toast.makeText(this, msg, Toast.LENGTH_LONG).show();

    }

    }

     

    • 项目文件-AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.tangzq" 

    android:installLocation="preferExternal" 

    android:versionCode="23" 

    android:versionName="1.6.2">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

    <activity android:name=".SliderEpubActivity" android:label="@string/app_name"

    android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar">

    <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>

    </activity>

    <uses-sdk android:minSdkVersion="7" />

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

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

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

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

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

    </manifest>

  • 相关阅读:
    #Bug--Mapper资源加载不到
    Spring项目用JUnit调试时出现错误 Failed to load ApplicationContext 的解决方法
    安装和配置maven遇到的坑
    DataGrip 异常
    数据库-1055报错-把only_full_group_by去掉
    spring boot 配置logback.xml 日志重复打印
    eclipse创建maven项目
    【C++11新特性】 C++11智能指针之weak_ptr
    socket编程中的粘包问题解决方案
    c++的反映机制实现
  • 原文地址:https://www.cnblogs.com/fx2008/p/3133186.html
Copyright © 2020-2023  润新知