0

我试图显示一个弹出窗口,里面有一个 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 等。在将 EditText 聚焦在设备上运行的 PopupWindow 中时,我遵循了提供的建议,但它们都不适合我。我不能使用对话框而不是弹出窗口,因为我希望弹出窗口位于屏幕上的某个特定位置,而这是对话框无法实现的。还尝试了所有其他建议,包括关闭自动建议、向输入元素添加其他属性,如 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>
4

0 回答 0