我在我的应用程序中使用webview。 Webview是使用应用程序上下文创建的。单击任何选择框时应用程序崩溃
04-10 14:19:14.502: E/AndroidRuntime(12628): Uncaught handler: thread main exiting due to uncaught exception
04-10 14:19:14.542: E/AndroidRuntime(12628): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.ViewRoot.setView(ViewRoot.java:476)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.app.Dialog.show(Dialog.java:239)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.webkit.WebView$InvokeListBox.run(WebView.java:9509)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Handler.handleCallback(Handler.java:609)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Handler.dispatchMessage(Handler.java:92)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.os.Looper.loop(Looper.java:123)
04-10 14:19:14.542: E/AndroidRuntime(12628): at android.app.ActivityThread.main(ActivityThread.java:4595)
04-10 14:19:14.542: E/AndroidRuntime(12628): at java.lang.reflect.Method.invokeNative(Native Method)
04-10 14:19:14.542: E/AndroidRuntime(12628): at java.lang.reflect.Method.invoke(Method.java:521)
04-10 14:19:14.542: E/AndroidRuntime(12628): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-10 14:19:14.542: E/AndroidRuntime(12628): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-10 14:19:14.542: E/AndroidRuntime(12628): at dalvik.system.NativeStart.main(Native Method)
我很清楚这个问题已被多次提出,但我还没有找到任何有效的解决方案。 如果我使用活动上下文,这个问题将得到解决,但由于其他一些问题,我必须使用应用程序上下文。对于其他警报和对话框,我通过覆盖webchromeclient中的onJsAlert()来处理它们,但是我无法找到如何在webview中拦截它并创建自己的选择器对话框。
非常感谢任何建议/帮助。
添加我的webview实现的虚拟样本
class MyWebView extends WebView
{
MyWebView(Context context)
{
super(context.getApplicationContext());
setWebChromeClient(myWebChromeClient);
setWebViewClient(myWebViewClient);
}
}
答案 0 :(得分:3)
这是因为在创建WebView时传递应用程序上下文而不是活动上下文。 要在WebView中显示Android中的选择框,WebView将使用在其构造函数中为其指定的上下文,并打开本机单选选择器。要显示此选择器对话框,它需要一个Activity上下文而不是Application的上下文。 改变这一行:
super(context.getApplicationContext());
这一行:
super(context);
您还需要确保在创建它的活动中使用Web视图(在其他活动中使用它没有任何意义)。如果您需要在不同活动中使用Web视图,只需使用指定活动的上下文创建一个。
答案 1 :(得分:0)
我希望您在这种情况下使用extends Activity
。
只需参考here。
如果你想使用除此之外的webView,那么我已经为此编写了代码。
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// Handle the error
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});