WebView に JavaScript の「確認」ボックスを表示させようとしていますが、(logcat から) 次の例外が表示されます。
E/AndroidRuntime( 387): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@40
5113d8 is not valid; is your activity running?
E/AndroidRuntime( 387): at android.view.ViewRoot.setView(ViewRoot.java:527)
E/AndroidRuntime( 387): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 387): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 387): at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/AndroidRuntime( 387): at android.app.Dialog.show(Dialog.java:241)
E/AndroidRuntime( 387): at com.playfish.our.app.activity.App$1.onJsConfirm(App.java:55)
E/AndroidRuntime( 387): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:526)
E/AndroidRuntime( 387): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 387): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 387): at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime( 387): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 387): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 387): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 387): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 387): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 60): Force finishing activity com.playfish.our.app/.activity.App
W/ActivityManager( 60): Activity pause timeout for HistoryRecord{4071cfc0 com.playfish.our.app/.activity.App}
私のダイアログのコードは次のとおりです。
webview.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d(getClass().getName(), cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId());
return true;
}
@Override
public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
{
quotaUpdater.updateQuota(spaceNeeded * 2);
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
new AlertDialog.Builder(App.this)
.setTitle("Update")
.setMessage(message)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton(android.R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.create()
.show();
return true;
}
});
現時点では、コードはあまりよく整理されていません (つまり、適切ではありません)。動作したらリファクタリングします:)
ダイアログに渡されたコンテキストが間違っていることに関係していると思います.Web上で同様の問題に対するいくつかの回答を見つけましたが、どれもうまくいきません。コンテキストに他の値を使用しましたが、getApplicationContext()、webview.getContext() など、どれも機能しませんでした....どんな助けでも大歓迎です。
ところで、私はJavaの経験がほとんどないJS開発者であるため、非常に愚かなことをしている可能性があります。