Могу ли я передать объект Javascript в Android WebView? - PullRequest
8 голосов
/ 02 апреля 2012

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

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

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

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

1 Ответ

15 голосов
/ 02 апреля 2012

Android's 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, не допускает никаких эксплойтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...