WebView で JavaScript 関数を呼び出し、アプリで応答を取得する際に問題があります (Galaxy Tab 2 '10 で)。コンテンツのロード後に直接 js 関数を呼び出します。この1つのソリューションによると、私はPictureListener
webView.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
webView.loadUrl("javascript: JsImpl.init('{response}');");
}
});
正常に動作します: コンテンツが読み込まれると、常に onNewPicture が開始されます。
"javascript: JsImpl.init('{response}')
以下を呼び出す js をロードします。
class JsImpl {
private final static String LOG_TAG = "JsImpl";
@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}
ログにD/JsImpl(18400): {response}
. 万事順調そうに見えますが…
タブを横向きまたは縦向きモードに切り替えると、WebView
再作成されonNewPicture
て開始されますが、メソッドpublic void init(String json)
はJsImpl
まったく呼び出されないことがよくあります!
したがって、向きを変えると、jsが機能する場合と機能しない場合があります。例外もエラーもありません...
誰が同じ問題に直面しましたか?
以下は完全なコードです
public class NextActivity extends Activity {
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
final WebView wv = (WebView) findViewById(R.id.WebView);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl("file:///android_asset/index.html");
wv.addJavascriptInterface(new JsImpl(), "JsImpl");
wv.setPictureListener(new PictureListener() {
@Override
public void onNewPicture(WebView view, Picture picture) {
wv.loadUrl("javascript: JsImpl.init('{responce}');");
}
});
}
class JsImpl {
private final static String LOG_TAG = "JsImpl";
@JavascriptInterface
public void init(String json) {
Log.d(LOG_TAG, json);
}
}
}
ここでは html コードは必要ありません。アセット ディレクトリに空の html ファイルを配置するだけですindex.html
。
編集: 私は1つの解決策を見つけましたが、それが正しいバリエーションであるかどうかは正確にはわかりません. しかし、それは機能します。ハンドラループを追加しました
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isJSSetup) return;
Log.i("handler-loop", "JS didn't handle. Reload page");
wv.loadUrl(CONTENT_PAGE);
handler.postDelayed(this, 1000);
}
}, 1000);
@JavascriptInterface init(String json) を呼び出すと、 にisJSSetup
なりましtrue
た。ハンドラー ループで、JS がセットアップされているかどうかを確認しますif (isJSSetup) return;
。いいえ - URL を再度リロードします wv.loadUrl(CONTENT_PAGE) を呼び出し、init(String json) を呼び出します。うまくいかない限り。ハードコードなので、まだ良い解決策を探しています。