2

私はAndroidを初めて使用し、JavaScript関数をロードして結果をコールバック関数に返すようにAndroidWebviewをセットアップしようとしていました。

以下のコードを参照してください

public class AWebViewActivity extends Activity {

    /**
     * Defines an Interface to call Syntax Highlighting Javascript and return the result
     * to a string by calling the call back function.
     */
     public class JavaScriptInterface {
         Context mContext;
         JavaScriptInterface(Context c) {
             mContext = c;
         }

         //add other interface methods to be called from JavaScript
         // This annotation is required in Jelly Bean and later:
         @JavascriptInterface
         public void receiveValueFromJs(String str) {
              //do something useful with str
              Toast.makeText(mContext, "Received Value from JS: " + str,Toast.LENGTH_LONG).show();
         }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Try WebView
        WebView webView = (WebView) findViewById(R.id.editor_view);
        //webView.setWebChromeClient(new WebChromeClient());

        webView.getSettings().setJavaScriptEnabled(true);

        // RiNxX's suggestion
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url){
                view.loadUrl("javascript:getValue()");
            }
        });

        webView.addJavascriptInterface(new JavaScriptInterface(this), "MyAndroid");
        webView.loadUrl("file:///mnt/sdcard/a.html");

        //SystemClock.sleep(1000);
        //webView.loadUrl("javascript:getValue()");
    }
}

HTMLファイルを以下に示します。

<html>
    <head>
    </head>
    <body>
        <script type="text/javascript">
            function getValue()
            {
                var val="Amith Raravi";
                MyAndroid.receiveValueFromJs(val);
            }
        </script>
    Hey ya
    </body>
</html>

また、マニフェスト要素の子としてインターネット権限を追加しました。StackOverflowに投稿された他の質問に目を通し、スクリプトをHTMLの本文に移動しました。

RiNxXによって提案された変更を追加した後、アプリが閉じ(コールバックは実行されません)、LogCatで以下の警告が表示されます

JNI WARNING: jarray 0x405414e8 points to non-array object (Ljava/lang/String;)
I/dalvikvm(361): "WebViewCoreThread" prio=5 tid=9 NATIVE
I/dalvikvm(361):   | group="main" sCount=0 dsCount=0 obj=0x4051d580 self=0x29a1a8
I/dalvikvm(361):   | sysTid=370 nice=0 sched=0/0 cgrp=default handle=2728672
I/dalvikvm(361):   | schedstat=( 277421205 460097188 88 )
I/dalvikvm(361):   at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
I/dalvikvm(361):   at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
I/dalvikvm(361):   at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:246)
I/dalvikvm(361):   at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1570)
I/dalvikvm(361):   at android.webkit.WebViewCore.access$1400(WebViewCore.java:53)
I/dalvikvm(361):   at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:956)
I/dalvikvm(361):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm(361):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm(361):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:629)
I/dalvikvm(361):   at java.lang.Thread.run(Thread.java:1019)
E/dalvikvm(361): VM aborting

私はもう1日以上そこにいます。どんな助けでも大歓迎です:)

4

4 に答える 4

5

どうやら、これは2.3.3エミュレーターの長年のバグでした。

以下のリンクを参照してください。

http://groups.google.com/group/android-developers/browse_thread/thread/992ca132e15745ec/da8da866d107e8b3?pli=1

現在、2.2および3.0エミュレータをダウンロードしています。

すべての助けと素晴らしいフォーラムに感謝します。

私はもっ​​と質問で戻ってきます!

于 2012-04-11T19:35:03.287 に答える
2

同じ問題が発生していますが、アセットからファイルを読み込もうとすると正常に機能しました。

webView.loadUrl("file:///android_asset/a.html");
于 2012-06-06T08:56:55.313 に答える
1

ページが読み込まれたときにjavascriptインターフェースを呼び出すwebviewクライアントを追加します

webview.setWebViewClient(new WebViewClient() {
@Override    
public void onPageFinished(WebView view, String url) {    
   view.loadUrl("javascript:getValue()");    
}   
webview.loadUrl(SOME_WEBPAGE);
于 2012-04-11T10:40:14.067 に答える
0

androidwebviewから呼び出されるjavaスクリプト

webView.loadUrl("javascript:setDatePickervalue(\""
                        + pselSelectedDateProp.getFormatedDate() + "\")");


Javaスクリプト関数

        <script type="text/javascript" language="JavaScript">
        function setDatePickervalue(selecteddate){          
                document.getElementById("text").innerHTML = selecteddate.toString();            
                //alert('hello' + selecteddate.toString());

            }
  </script>

....私はあなたがしたのと同じことを実装しようとしていました...それは私にエミュレーターで例外を中止するvmを与えます...しかしそれはデバイス上でうまく機能しています..

于 2012-04-16T10:54:29.227 に答える