Могу ли я передать объект Javascript в Android WebView?

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

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

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

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

 Tejasvi Hegde21 сент. 2015 г., 17:02
Проверьте ответы в аналогичной темеstackoverflow.com/questions/2250917/...

Ответы на вопрос(1)

Решение Вопроса

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 не допускает никаких подвигов.

 Michael19 окт. 2017 г., 02:26
что если я хочу сделать свою функцию Java конструктором, то я бы назвал, например,var ob = new Android.MyObject()Как бы я вернуть нативный объект JavaScript?
 Simon30 апр. 2012 г., 17:31
После попытки заставить этот ответ работать, я обнаружил, что интерфейс javascript полностью поврежден в v2.3.x Android. Позор.
 Simon03 апр. 2012 г., 09:34
Спасибо, Джейсон. Из того, что вы говорите, невозможно просто передать объект javascript непосредственно в функцию установки java и ожидать, что он будет переведен. Итак, чтобы возобновить, мне нужно: - взять мой объект JSON и вернуть его обратно в строку, закодированную в json; - передать закодированную строку обратно через интерфейс javascript; - декодировать ее в объект java. Все это для доступа к данные правильно. Спасибо за разъяснение этого.

Ваш ответ на вопрос