我正在尝试显示一个带有webview的弹出窗口,其中包含很少的HTML文本输入。当我关注第一个输入框时,键盘出现,一切都很好。当我尝试聚焦下一个输入框时,我的应用程序崩溃时出现以下异常。
01-21 20:31:19.736: W/System.err(14374): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@2a54119c is not valid; is your activity running?
01-21 20:31:19.737: W/System.err(14374): at android.view.ViewRootImpl.setView(ViewRootImpl.java:562)
01-21 20:31:19.737: W/System.err(14374): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)
01-21 20:31:19.737: W/System.err(14374): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.invokePopup(PopupWindow.java:1058)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:887)
01-21 20:31:19.737: W/System.err(14374): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:851)
01-21 20:31:19.737: W/System.err(14374): at com.android.org.chromium.content.browser.input.HandleView.showContainer(HandleView.java:176)
01-21 20:31:19.737: W/System.err(14374): at com.android.org.chromium.content.browser.input.HandleView.show(HandleView.java:190)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.showHandleIfNeeded(InsertionHandleController.java:191)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.showHandle(InsertionHandleController.java:67)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.ContentViewCore$10.showHandle(ContentViewCore.java:2067)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.input.InsertionHandleController.onCursorPositionChanged(InsertionHandleController.java:91)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.content.browser.ContentViewCore.onSelectionBoundsChanged(ContentViewCore.java:2557)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
01-21 20:31:19.738: W/System.err(14374): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:28)
01-21 20:31:19.738: W/System.err(14374): at android.os.Handler.dispatchMessage(Handler.java:102)
01-21 20:31:19.738: W/System.err(14374): at android.os.Looper.loop(Looper.java:135)
01-21 20:31:19.738: W/System.err(14374): at android.app.ActivityThread.main(ActivityThread.java:5223)
01-21 20:31:19.738: W/System.err(14374): at java.lang.reflect.Method.invoke(Native Method)
01-21 20:31:19.738: W/System.err(14374): at java.lang.reflect.Method.invoke(Method.java:372)
01-21 20:31:19.738: W/System.err(14374): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
我在堆栈溢出和网络上看到了类似的问题报告,并且没有运气地遵循所有可能的建议。奇怪的是,这个问题只发生在运行android 4.4及更高版本的设备上。它适用于4.3,4.2等。我已按照Exception when focusing a EditText in a PopupWindow running on Device提供的建议,但它们都不适用于我。我不能使用Dialog而不是弹出窗口,因为我希望弹出窗口位于屏幕上的某个特定位置,这是对话框无法实现的。还尝试了所有其他建议,包括关闭自动建议,向输入元素添加其他属性,如autocomplete =“off”,autocorrect =“off”,但没有一个工作。
我注意到的另一件事是,如果我在两个文本框之间有任何其他类型的HTML元素,请说下拉,从第一个输入元素导航到下拉列表然后到下一个输入元素将不会崩溃应用程序,并将正常工作。基本上当键盘由android 4.4及更高版本的第一个输入框呈现时,弹出窗口的令牌管理器将进行折腾。我怎么解决这个问题?这是Android 4.4及更高版本中的错误吗?如果是这样,有什么工作吗?
代码:
public class MainActivity extends Activity {
private PopupWindow pw;
View contentView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
contentView = inflater.inflate(R.layout.popup, null, false);
pw = new PopupWindow(contentView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
loadContentView(contentView);
}
public void showPopUp(View view){
pw.showAtLocation(contentView, Gravity.CENTER, 10, 10);
}
public void loadContentView(View view){
WebView mWebView = new WebView(this);
mWebView.loadUrl("file:///android_asset/test.html");
LinearLayout ll = (LinearLayout)view.findViewById(R.id.contentLayout);
ll.addView(mWebView);
}
}
弹出式布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:orientation="vertical">
<LinearLayout
android:id="@+id/contentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" android:background="#00ff00"/>
</LinearLayout>
HTML
<html>
<head>
<meta name=viewport content="width=device-width, initial-scale=1">
</head>
<body>
<h1 style="color:blue">This is a heading</h1>
<p style="color:red">This is a paragraph.</p>
first text ::<input type="text" autocorrect="off" autocapitalize="off" autocomplete="off"/>
second text ::<input type="text" autocorrect="off" autocapitalize="off" autocomplete="off"/>
</body>
</html>