setBuiltInZoomControls 与 PopupWindow 内的 WebView

setBuiltInZoomControls with WebView inside of PopupWindow

我有一个 PopupWindow,它在按下按钮时显示 WebView。如果 setBuiltInZoomControls 设置为 false,WebView 将按预期显示页面。但是,如果 setBuiltInZoomControls 设置为 true,与 WebView 的任何交互(滚动、双指缩放)都会导致错误。

这是 Java 代码:

  mHelpButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
            View popupView = inflater.inflate(R.layout.help_pop, null);
            int width = WindowManager.LayoutParams.MATCH_PARENT;
            int height = WindowManager.LayoutParams.WRAP_CONTENT;
            final PopupWindow popupWindow = new PopupWindow(popupView, 1, 1, true);
            popupWindow.setWindowLayoutMode(width,height);
            popupWindow.setOutsideTouchable(true);
            popupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), ""));
            TextView helpText = (TextView) popupView.findViewById(R.id.help_text);
            WebView webView = (WebView)popupView.findViewById(R.id.app_question_help_web_view);
            if (!mQuestion.casiHelpText.contains("http://") && !mQuestion.casiHelpText.contains("<")) {
                helpText.setText(mQuestion.casiHelpText);
                popupWindow.showAsDropDown(mHelpButton);
            } else if (mQuestion.casiHelpText.contains("http://") && !mQuestion.casiHelpText.contains("<")) {
                if ((getResources().getConfiguration().screenLayout &
                        Configuration.SCREENLAYOUT_SIZE_MASK) ==
                        Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                    Log.d(TAG,"Large size screen targeted");
                    webView.setVisibility(View.VISIBLE);
                    helpText.setVisibility(View.GONE);
                    webView.getSettings().setJavaScriptEnabled(true);
                    webView.getSettings().setLoadWithOverviewMode(true);
                    webView.getSettings().setUseWideViewPort(true);
                    webView.getSettings().setBuiltInZoomControls(true);
                    webView.loadUrl(mQuestion.casiHelpText);
                    findViewById(R.id.app_questions_activity_layout).post(new Runnable() {
                        public void run() {
                            popupWindow.showAsDropDown(mHelpButton);
                        }
                    });
                }
                     else {
                        Intent i = new Intent(QuestionsActivity.this, WebViewActivity.class);
                        i.setData(Uri.parse(mQuestion.casiHelpText));
                        startActivity(i);
                    }
            } else {

                if ((getResources().getConfiguration().screenLayout &
                        Configuration.SCREENLAYOUT_SIZE_MASK) ==
                        Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                    webView.setVisibility(View.VISIBLE);
                    helpText.setVisibility(View.GONE);
                    String baseHtml = "<html><meta name=\"viewport\" content=\"width=200\"/><head><title></title></head><body>" + mQuestion.casiHelpText + "</body><html>";
                    webView.loadDataWithBaseURL(null, baseHtml, "text/html", "UTF-8", null);

                            popupWindow.showAsDropDown(mHelpButton);
                    webView.setWebViewClient(new WebViewClient() {
                        @Override
                        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                            return false;
                        }
                    });
                } else {
                    Intent i = new Intent(QuestionsActivity.this, WebViewActivity.class);
                    i.putExtra("HTML", mQuestion.casiHelpText);
                    startActivity(i);
                }

            }

        }
    });

这是我的 Layout.xml (sw600dp)。只包含一个 Webview 和一个 TextView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:gravity="center"
android:background="@android:color/darker_gray">

<WebView
    android:id="@+id/app_question_help_web_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:visibility="gone"/>

<TextView
    android:id="@+id/help_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="testestestetstetst"
    android:textColor="@android:color/white"
    android:layout_below="@+id/app_question_help_web_view"
    />

这是错误:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.******, PID: 19046
    android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@4241c6c0 is not valid; is your activity running?
            at android.view.ViewRootImpl.setView(ViewRootImpl.java:748)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:373)
            at com.android.org.chromium.android_webview.AwZoomControls.invokeZoomPicker(AwZoomControls.java:28)
            at com.android.org.chromium.content.browser.ContentViewCore.invokeZoomPicker(ContentViewCore.java:2607)
            at com.android.org.chromium.content.browser.ContentViewGestureHandler.onScroll(ContentViewGestureHandler.java:429)
            at com.android.org.chromium.content.browser.third_party.GestureDetector.onTouchEvent(GestureDetector.java:594)
            at com.android.org.chromium.content.browser.ContentViewGestureHandler.processTouchEvent(ContentViewGestureHandler.java:970)
            at com.android.org.chromium.content.browser.ContentViewGestureHandler.onTouchEvent(ContentViewGestureHandler.java:802)
            at com.android.org.chromium.content.browser.ContentViewCore.onTouchEvent(ContentViewCore.java:1244)
            at com.android.org.chromium.android_webview.AwContents.onTouchEvent(AwContents.java:1523)
            at com.android.webview.chromium.WebViewChromium.onTouchEvent(WebViewChromium.java:1833)
            at android.webkit.WebView.onTouchEvent(WebView.java:2167)
            at android.view.View.dispatchTouchEvent(View.java:8115)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2129)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.widget.PopupWindow$PopupViewContainer.dispatchTouchEvent(PopupWindow.java:1979)
            at android.view.View.dispatchPointerEvent(View.java:8323)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4623)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4491)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4049)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4103)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4072)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4183)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4080)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4240)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4049)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4103)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4072)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4080)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4049)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6415)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6334)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6305)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6270)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6495)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
            at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
            at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
            at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6468)
            at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6514)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:

似乎是尝试显示缩放控件导致此错误。如果您为弹出视图关闭它们,这应该是固定的:

webView.getSettings().setDisplayZoomControls(false);

缩放控件是老式的东西,我认为您真的不需要它。 setBuiltInZoomControls(true) 启用双指缩放 控件,然后需要关闭控件。