2012-04-30 9 views
58

AndroidアプリでJavaコードを同期呼び出しする必要があります。 https://stackoverflow.com/a/3338656Android WebViewのJavaScriptからJava関数を呼び出す

私のJavaコード:

final class MyWebChromeClient extends WebChromeClient { 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      Log.d("LogTag", message); 
      result.confirm(); 
      return true; 
     } 
    } 

私のJavaScriptコード:私はjava_callボタンをタップすると

<html> 
<script> 
function java_request(){ 
    alert('test'); 
} 
</script> 
<body> 
<h2>Welcome</h2> 
<div id="area"></div> 
<form> 
<input type="button" value="java_call" onclick="java_request()"> 
</form> 
</body> 
</html> 

は、ボタンがに行く

私は、このソリューションを使用しています押された状態。コンソールログに'test'があります。ここまではすべて正常です。

問題は、ボタンが正常な状態に戻らないことです。押された状態のままです。たぶんJavaScriptの実行が壊れているのでしょうか?

ボタンが正常な状態に戻らないのはなぜですか?

答えて

81

これは、JavaコードをJavaコードで実行するのに最適なソリューションではないと思います。ここを参照してください:

あなたはjavascriptを経由して呼び出し可能であることをHTMLにネイティブコードを公開したい場合は、あなたのWebビューの宣言の周りに、次の操作を行います。

public class JavaScriptInterface { 
    private Activity activity; 

    public JavaScriptInterface(Activity activiy) { 
     this.activity = activiy; 
    } 

    public void startVideo(String videoAddress){ 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); 
     activity.startActivity(intent); 
    } 
} 

JavaScriptInterface jsInterface = new JavaScriptInterface(this); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.addJavascriptInterface(jsInterface, "JSInterface"); 

は、クラスJavaScriptInterfaceを宣言

私はビデオを再生するための単一の関数を宣言していますが、何でもできます。

は、最後に簡単なJavaScriptの呼び出しを介して WebView内容でこれを呼び出す:

<video width="320" height="240" controls="controls" poster='poster.gif' 
     onclick="window.JSInterface.startVideo('file:///sdcard/test.3gp');" > 
    Your browser does not support the video tag. 
</video> 

の例では、ビデオの再生については、私の別の答えから取られているが、十分に説明しなければなりません。 CedricSoubrieさんのコメント@を1として

EDIT:アプリケーションのターゲットバージョンが17以上に設定されている場合は、Webビューにエクスポートする各メソッドの上に注釈@JavascriptInterfaceを追加する必要があります。

+1

情報ありがとう、私はこの解決策を見た。 2.3.Xにはこの解決策のバグがあるので、私はそれを使いたくない。回避策は非常に素晴らしいものでした。 – ozkolonur

+0

@ozkolonurこれはAndroid 2.2以降のすべてのバージョンでこれを使っていますが、バグは見たことがありません。それは何かを分かち合うことができますか?リンクも大歓迎です。 –

+0

http://code.google.com/p/android/issues/detail?id=12987 – ozkolonur

1

あなたの関数は 'true'を返します。これにより、HTMLコードの 'onclick'プロパティがtrueになり、ボタンはクリックされたままになります。

関連する問題