今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分

首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解了一下,你如何在Xamarin中使用了WebView因為重複的部分我就不另外解釋了

1. 首先建立Layout  - /Resources/Layout/Main.axml

正如同之前文章一樣我們先建立Layout裡面包含了一個名為webviewMain的WebView

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webviewMain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

2.我們必須先建立橋接器 讓Javascript可以呼叫到 Native的部分,在Android的世界中他有一個專有名詞叫做 JavascriptInterface ,我們就來實作看看

因為範例關係我們開一個名為DonmaJavascriptInterface 的 JavascriptInterface 避免搞混,首先建立一個Class 檔案


再來就是程式碼的部分

using Android.Content;
using Android.Widget;
using Java.Interop;
 
namespace WebviewJsCallNative
{
    /// <summary>
    /// 橋接Javascript to Native Code 請注意一定要繼承 Java.Lang.Object
    /// </summary>
    public class DonmaJavascriptInterface : Java.Lang.Object
    {
        private Context _Context;
 
 
        /// <summary>
        /// 因為toast必須要用到該呈現的Context 所以在Ctor中強制傳入
        /// </summary>
        /// <param name="context"></param>
        public DonmaJavascriptInterface(Context context)
        {
            _Context = context;
        }
 
 
        /// <summary>
        /// 顯示從Javascript 傳進來的string 並以吐司顯示
        /// 請注意Export 一定要加 但是專案記得要先add reference Mono.Android.Export
        /// </summary>
        /// <param name="toastString"></param>
        [Export]
        public void ShowToast(string toastString)
        {
            Toast.MakeText(_Context, toastString, ToastLength.Long).Show();
        }
 
 
    }
}

這邊有一些地方要注意,第一點 該Class 請要繼承 Java.Lang.Object。第二點在可以被呼叫的Method 請為public 而且上面必須要有[Export] 的attribute 如果你compile會錯他說不認識 記得要加入 Mono.Android.Export ,這樣compile 就不會錯了
3.我們來看主要的Activity 的程式碼部分

using System;
 
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using Android.Widget;
using Android.OS;
 
namespace WebviewJsCallNative
{
    [Activity(Label = "JS Call Native", MainLauncher = true, Icon = "@drawable/icon")]
    public class Activity1 : Activity
    {
        WebView webviewMain;
 
        protected override void OnCreate(Bundle bundle)
        {
 
            base.OnCreate(bundle);
 
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
 
            webviewMain = FindViewById<WebView>(Resource.Id.webviewMain);
            
 
            //啟用Javascript Enable
            webviewMain.Settings.JavaScriptEnabled = true;
 
            //啟動橋接,加入WebView 中 JS 呼叫介面
            var javaCallInterface = new DonmaJavascriptInterface(this);
            //後面那參數 interfacename 很重要 決定於 你在Javascript中怎麼呼叫他
            webviewMain.AddJavascriptInterface(javaCallInterface, "AndroidFunction");
            // 請注意這行,如果不加入巢狀Class 會必成呼叫系統讓系統來裁決開啟http 的方式
            webviewMain.SetWebViewClient(new CustWebViewClient());
 
            //請注意路徑為 file:///android_assets/檔案名稱
            webviewMain.LoadUrl("file:///android_asset/index.html");
 
 
        }
 
        /// <summary>
        /// 巢狀Class 繼承WebViewClient
        /// </summary>
        private class CustWebViewClient : WebViewClient
        {
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
 
        }
 
        /// <summary>
        /// 覆寫使其back可以直接回上一頁並非預設的離開APP
        /// </summary>
        /// <param name="keyCode"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public override bool OnKeyDown(Android.Views.Keycode keyCode, Android.Views.KeyEvent e)
        {
            if (keyCode == Keycode.Back && webviewMain.CanGoBack())
            {
                webviewMain.GoBack();
                return true;
            }
            return base.OnKeyDown(keyCode, e);
        }
    }
}
 

紅色的部分是跟上次範例[Xamarin] 使用Webview 來做APP 有差異的部分我這邊標示起來, 這邊有幾點要注意 ,第一點: 我們在webViewMain加入了我們自訂的JavascriptInterface 並且取名字為 AndroidFunction 這是你自己命名的之後你在Javascript的地方就會透過這名詞來呼叫Native code的methods 。第二點: 因為我們不是呼叫網路上面的網址,所以我們必須把在專案需要用到的.html 等檔案都放在Assets 檔案夾下方 所以指定webviewMain路徑就會設定到 file:///android_asset/檔案名稱 。

4.接下來就是html 的部分了 首先我們建立檔案的時候 必須要注意檔案Copy to Output Directory的部分設定為copy always 之類的會比較保險

這裡面我放入了範例,index.html + jquery + 圖片檔 我們來看index.html 的source code :

<html>
 
 
<head>
    <title>當麻測試Native+WebView 混編</title>
<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
   1:  
   2:  
   3: </head>
   4: <body>
   5:     
   6:     <a href="http://no2don.blogspot.com">當麻許的超技八</a>
   7:     <img src="no2don.jpg" id="img1" style="width: 200px" /> <br />
   8:     <span id="spanContent"></span>
   9:  
  10:     <script>
  11:  
  12:         $('#img1').click(function () {
  13:             // 請注意這是我們在Native 那邊在 AddJavascriptInterface的時候取名為 AndroidFunction
  14:             AndroidFunction.ShowToast("您好我是來自於網頁的值!!,我呼叫了Native的method");
  15:         });
  16:  
  17:         
  18:     
</script>
</body>
 
 
</html>

我們希望img1 被點擊時候會呼叫Native 的 ShowToast method 並且帶參數給他,其中我也用到jquery 來做測試看看能不能使用(好啦我承認是我很懶),來進行測試。 呼叫結果:


這樣混編,如果在開發一些案子上面或許是個不錯的選擇

[Xamarin] 透過Native Code呼叫 JavaScript function (转帖)的更多相关文章

  1. [Xamarin] 透過WebClient跟網路取得資料 (转帖)

    之前寫過一篇文章,關於在Android上面取得資料 透過GET方式傳資料給Server(含解決中文編碼問題) 我們來回顧一下 Android 端的Code: 有沒有超多,如果是在Xaramin下面,真 ...

  2. [Xamarin] 透過StartActivityForResult傳值回來(转贴)

    上一篇文章(開啟另外一個Activity 並且帶資料),提到了開啟一個新的Activity ,我們將值透過intent 帶到下個Activity 但是,如果我們開啟的Actrivity其實是有一個任務 ...

  3. [Xamarin] 透過 intent-filter 來接管 http ,製作偽瀏覽器 (转帖)

    使用Android 的朋友一定對這畫面不陌生在開啟網址的時候,或是Youtube連結的時候,因為Android 發現,你手機安裝的App有哪些可以支援這些東西的瀏覽 所以,就可以使用甚麼東西來進行開啟 ...

  4. [Xamarin] 透過 IsolatedStorageFile儲存資料(转帖)

    開發手機App通常都會遇到想要儲存資料的,舉個例來說,像是 (圖片來源:http://docs.xamarin.com/guides/android/application_fundamentals/ ...

  5. webview的javascript与Native code交互

    http://my.oschina.net/u/1376187/blog/172296 项目中使用了webview显示网页,其中需要网页和native方法有交互,搜索到一篇文章,转发分享一下: === ...

  6. 打印发现function toUpperCase() { [native code] }

    var s='hello' undefined s.toUpperCase function toUpperCase() { [native code] } s.toUpperCase() " ...

  7. [Xamarin.Android] 如何透過電子郵件部署Xamarin.Android App (转帖)

    Android App在部署到實機的時候不像iOS的App限制你一定要使用向Apple申請的開發者憑證,在Apple不管是你要上架到Apple Store或者是企業內部署,你都必須向蘋果申請憑證. 而 ...

  8. 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案

    简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...

  9. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

随机推荐

  1. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  2. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  3. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  4. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  5. IE的F12开发人员工具不显示问题

    按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的缩略图上,右键-最大化,工具就全屏出现 ...

  6. ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)

    操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...

  7. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  8. stringstream的基本用法

    原帖地址:https://zhidao.baidu.com/question/580048330.htmlstringstream是字符串流.它将流与存储在内存中的string对象绑定起来.在多种数据 ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  10. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...