2012-04-02 2 views
8

Я переношу веб-приложение в версию для Android. После получения и обработки данных JSON у меня есть массив объектов Javascript, которые хранятся на странице.Могу ли я передать объект Javascript в Android WebView?

Как передать содержимое одного из объектов javascript «out» в контейнер webview для отображения с использованием встроенных элементов управления Android?

В конце концов, я мог бы создать интерфейс javascript с методом, имеющим параметры для каждого из возможных свойств объекта javascript, но это, по-видимому, слишком тяжелое.

Может ли кто-нибудь помочь в этом?

+1

Проверить ответы в аналогичной теме http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –

ответ

15

Android WebView содержит метод, называемый addJavascriptInterface(Object obj, String interfaceName), который должен быть полезен здесь.

Используя этот метод, объект obj, который вы добавляете в качестве интерфейса, можно получить через код JavaScript в веб-представлении. В вашем случае вы можете передать объект, который имеет метод setter, который переносит некоторый объект JavaScript обратно на Java.

Вам все равно необходимо создать код клея, который преобразует ваш объект JavaScript в объект JSON. Для быстрого подхода вы можете просто создать свой интерфейс для создания JSONObject на стороне Java, используя строку JSON, переданную из JavaScript. Класс JSONObject в Java имеет конструктор, который принимает строку, содержащую данные JSON. Таким образом, вы можете передать строковый результат непосредственно обратно в 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:

Android.passObject("pageItems", jsonData); 

Теперь, ваш JSInterface на стороне Java будет иметь JSONObject, содержащий элементы, к которым вы можете получить доступ, используя получатели, предоставленные JSONObject. Объекты, созданные с помощью вызова Javascript, будут отображаться на карте mObjectsFromJS. Конечно, вы захотите добавить дополнительные вспомогательные методы в класс JSInterface, чтобы лучше управлять объектами.

Я не компилировал и не тестировал ни один из этих методов, поэтому вам может понадобиться немного настроить их для правильной работы. Но, надеюсь, это дает вам эту идею.

Однако, если объекты имеют согласованный интерфейс и элементы данных, было бы разумнее просто создать простую функцию JavaScript-клей, которая связывает свойства объекта JavaScript с полями на стороне Java, используя методы настройки.

ОБРАТИТЕ ВНИМАНИЕ Это дает возможность удаленного кода запускать собственный код на вашем устройстве. Если у вас нет полного контроля над страницами/сценариями, загружаемыми в WebView, вы должны убедиться, что поведение, обнаруженное obj, не допускает каких-либо эксплойтов.

+0

Спасибо Джейсону, Из того, что вы говорите, невозможно просто передать объект javascript непосредственно в функцию set java и ожидать, что он будет переведен. Таким образом, чтобы возобновить, я должен был бы: - взять мой объект JSON и вернуть его обратно в JSon закодированной строки - передать закодированную строку обратно через яваскрипта интерфейс - декодировать его в объект Java Все это для правильного доступа к данным. Благодарим вас за разъяснение этого. – Simon

+0

Попытавшись получить этот ответ на работу, я обнаружил, что интерфейс javascript полностью нарушен в v2.3.x Android. Позор. – Simon

+0

Что делать, если я хочу, чтобы моя Java-функция была конструктором, поэтому я бы назвал, например. 'var ob = new Android.MyObject()', как я могу вернуть собственный объект javascript? – Michael

Смежные вопросы