Android - использование addJavaScriptInterface для возврата значения из Javascript - PullRequest
6 голосов
/ 15 марта 2011

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

public class JSExample extends Activity {
WebView mWebView;
String mString;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mWebView = (WebView)findViewById(R.id.mWebView);
    mWebView.addJavascriptInterface(new ClsAccessor(), "accessor");
    String html = getAssetsContent("jsinterface.html");

    mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);

 //   Log.d("YO!", mString);        
}

private String getAssetsContent(String filename){
    .....
}

private void closeStream(BufferedReader stream) {
    .....
}

class ClsAccessor{
    public void setValue(String value){
        JSExample.this.mString = value;
    }
}

Вот HTML-файл, загруженный моим WebView, который содержит JavaScript, который я хочу запустить:

    <!DOCTYPE html>

<html>
<head>
    <script language="javascript">
        accessor.setValue('Hello!');
    </script>
</head>
<body>
<h1>Testing</h1>
</body>
</html>

Это не работает. Когда я запускаю код с помощью «Log.d (« YO! », MString);» uncommented Я получаю исключение нулевого указателя, что означает, что javascript никогда не назначал значение для mString. что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Это может быть не правильно, мне придется перепроверить, но это может быть из-за потери ссылки ..

Попробуйте сделать вашу ClsAccessor ссылку на элемент уровня один ..

public class JSExample extends Activity {
    ...
    ClsAccessor _accessor = new ClsAccessor();
    ...
    public void onCreate(Bundle savedInstanceState) {
        ...
        mWebView.addJavascriptInterface(_accessor, "accessor");
        ...

Также, если вы отлаживаете построчно, setValue() когда-нибудь вызывается в управляемом коде?

Для чего это стоит, у меня есть код, который делает, как я описал выше, и скрипт дляУправляемый интерфейс работает нормально, однако я не в состоянии проверить и проверить, работает ли ссылка на класс.

2 голосов
/ 18 августа 2011

Попробуйте включить javascript на веб-сайте:

mWebview.getSettings().setJavaScriptEnabled(true);
0 голосов
/ 15 марта 2011

Я делаю это, используя onLoadResource в своем классе Webview.

HTML-страница:

<html>
<head>
function Submit(){

        var username = $('#username').val();
        var urlNew = 'processing.php';
        urlNew = urlNew + '?' + 'username=' + username;
        $('#submit').attr('href', urlNew);

        return true;
    }
</head>
<body>
    <form>
        <input id="username" name="username" type="text" />
        <a href="" id="submit" onclick="return Submit();" ><img  src="images/button.png" /></a>
     </form>
</body>
</html>

Итак, в моем onLoadResource я слушаю этот URL:

public void onLoadResource(WebView view, String url)
        {
            if(url.contains("http://domain.com/processing.php")){

//process the url and suck out the data

}

Возможно, это не то, что вам нужно, но были причины, по которым я должен был сделать это таким образом, поэтому подумал, что это может вам помочь.Также обратите внимание, что я не отправлял форму, я отправил <a>, это потому, что onLoadResource не будет принимать отправку формы.

Редактировать: Это может помочь.

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