2012-04-02 120 views
8

我正在將一個web應用程序遷移到android版本。 收到並處理了JSON數據之後,我在頁面中保存了一個Javascript對象數組。我可以將Javascript對象傳遞給Android WebView嗎?

我如何通過JavaScript對象「走出去」的網頁視圖容器使用原生Android控件顯示一個的全部內容?

最後,我可以創建具有用於每個可能的javascript對象的屬性參數的方法JavaScript接口 - 但這似乎是過於沉重。

任何人都可以在這方面幫助?

+1

入住類似於螺紋的答案 http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 – 2015-09-21 15:02:51

回答

15

Android的WebView包含一個名爲addJavascriptInterface(Object obj, String interfaceName)方法應該會有幫助。

使用這種方法,你添加爲接口的對象obj可以通過在Web瀏覽JavaScript代碼進行訪問。在你的情況下,你可以傳入一個具有setter方法的對象,該方法將一些JavaScript對象轉換回Java。

您仍需要創建您的JavaScript對象轉換成JSON對象的膠水代碼。對於一種快速方法,您可以讓您的界面使用從JavaScript傳遞的JSON字符串在Java端生成JSONObject。 Java中的JSONObject類具有接受包含JSON數據的String的構造函數。因此,您可以直接將字符串化結果傳遞迴Java,並以此方式創建對象。例如:

class JSInterface { 
    HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>(); 
    public void passObject(String name, String json) { 
     mObjectsFromJS.put(name, new JSONObject(json)); 
    } 
} 

//At some point, register using: 
mJSInterface = new JSInterface(); 
mWebView.addJavascriptInterface(mJSInterface, "Android"); 

然後,在JavaScript端,在處理程序中有未解析JSON的可變jsonData一個blob:

Android.passObject("pageItems", jsonData); 

現在,你在Java端JSInterface將有包含項目的JSONObject,您可以使用JSONObject提供的getters訪問項目。通過Javascript調用創建的對象將位於mObjectsFromJS地圖中。您當然想要將其他輔助方法添加到JSInterface類中,以便更好地管理對象。

我還沒有編譯或測試任何這些方法,所以你可能不得不調整他們一點正確的操作。但希望這給你的想法。但是,如果對象具有一致的接口和數據項,那麼只需創建一個簡單的JavaScript粘連函數,使用setter方法將JavaScript對象屬性綁定到Java端對象字段將更爲明智。

請注意 這是給觸發設備上的原生代碼遠程代碼的能力。如果您無法完全控制正在加載到WebView中的頁面/腳本,則應確保obj公開的行爲不允許任何漏洞利用。

+0

謝謝你傑森, 從你所說的話,不可能「簡單地」將javascript對象直接傳遞給java setter函數並期望它被翻譯。 因此,要恢復,我需要: - 把我的JSON對象,將其恢復爲一個JSON編碼字符串 - 通過JavaScript接口, 通過編碼字符串備份 - 它解碼成一個Java對象 所有那些能夠正確訪問數據。 謝謝你澄清這一點。 – Simon 2012-04-03 07:34:00

+0

試圖讓這個答案工作後,我發現JavaScript的界面在Android的v2.3.x中完全破解。恥辱。 – Simon 2012-04-30 15:31:51

+0

如果我想讓我的Java函數成爲構造函數,那麼我會打電話給'var ob = new Android.MyObject()',我將如何返回一個原生的javascript對象? – Michael 2017-10-19 00:26:08

相關問題