安卓:在我的webview中打开弹出窗口

17

我的应用程序中有一个webview,我希望当用户点击webview内的链接时可以弹出窗口。我添加了下面的代码,但它没有起作用:

WebSettings webSettings = webViewPage.getSettings();    
webSettings.setJavaScriptEnabled(true);    
webSettings.setSupportMultipleWindows(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

这就是我想要的弹出窗口 弹出窗口应该呈现为这样

4个回答

56

三年后,我回答自己的问题:

当在网页中点击一个链接时,根据网页实现的不同,有两种可能的情况: 1)链接将在同一窗口中打开。 2)链接将在新窗口中打开。

对于第一个情况,可以使用以下代码轻松处理:

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

在WebViewClient实现中覆盖shouldOverrideUrlLoading方法将在同一窗口中打开链接。

现在让我们看看第二种情况,即网页请求在新窗口中打开链接的URL。对于这种情况,我们需要告诉我们的WebView支持多个窗口,像下面这样:

webView.getSettings().setSupportMultipleWindows(true);

然后向Webview添加一个新的Web Chrome客户端,以便在网页请求新窗口时获取事件。

webView.setWebChromeClient(new WebChromeClient() {


        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog,
                boolean isUserGesture, Message resultMsg) {



                WebView newWebView = new WebView(WebpageActivity.this);
                newWebView.getSettings().setJavaScriptEnabled(true);
                newWebView.getSettings().setSupportZoom(true);
                newWebView.getSettings().setBuiltInZoomControls(true);
                newWebView.getSettings().setPluginState(PluginState.ON);
                newWebView.getSettings().setSupportMultipleWindows(true);
                view.addView(newWebView);
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();

                newWebView.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        view.loadUrl(url);
                        return true;
                    }
                });

                return true;
            }
        }

    });

干杯!!!


2
那真是救了我的一天,@Vikalp。非常感谢你提供的解决方案。我在加载网站弹出窗口时遇到了问题,导致应用程序崩溃。WebviewTransport 的概念解决了这个问题。再次感谢! - Swr7der
1
@Swr7der 万岁! - Vikalp
1
这是一个很好的答案。我没有想到要将resultMsg.obj转换为WebView.WebViewTransport,这让我无法得出结论。这里的文档应该更清晰明了。 - davejoem
2
谈论第二种情况——弹出窗口仅占屏幕的一小部分。是否有办法使其全屏或更改其大小,以便在其较小的尺寸不可见时用户不会忽略它? - Amar
1
在实施此项操作之前,请阅读此处的实施注意事项:__https://developer.android.com/guide/webapps/webview#web-management__,以了解`onCreateWindow`。 - Mohd Qasim
显示剩余3条评论

1
将以下代码添加到您的 Web 视图中:web.addJavascriptInterface(new Jscalls(this), "Android"); 然后在加载到 Web 视图中的 HTML 的 href 中添加以下代码:href="javascript:showAndroidToast('要显示的数据或要显示数据的 URL')"
   public class Jscalls {
    Context mContext;

    Jscalls(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */ 
    @JavascriptInterface
            public void showToast(final String toast) {
                // Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
                if (NetworkConnection.isConnected(mContext)) {
                    ((Activity)mContext).runOnUiThread(new Runnable() {
                        public void run() {
                            dialog = new Dialog(mContext);
                            dialog.setTitle("Title");

                            dialog.setContentView(R.layout.dialog);
                            dialog.setCancelable(true);
                            // there are a lot of settings, for dialog, check them all out!
                            // set up text

                            WebView web = (WebView) dialog.findViewById(R.id.webVie);
                            web.getSettings().setJavaScriptEnabled(true);
                            /*web.clearHistory();
                            web.clearFormData();
                            web.clearCache(true);*/
                            web.setWebViewClient(new HelloWebViewClient());
                            web.setOnLongClickListener(new OnLongClickListener() {
                                @Override
                                public boolean onLongClick(View v) {
                                    return true;
                                }
                                });
                            web.setLongClickable(false);
                            try{
                                web.loadUrl(Url.mainUrl 
                                        + toast);//Url to load data from in pop-up
                            }catch (Exception e) {
                                // TODO: handle exception
                                //e.printStackTrace();
                            }   


                            // dialog.setContentView(web);
                            dialog.show();
                        }
                    });

                    //web = null ;
                    // now that the dialog is set up, it's time to show it

                    /*
                     * dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
                     * R.drawable.ic_launcher);
                     */

                    // dialog.setFeatureDrawable
                } else {
                    LoginMainActivity.validateEmail("Alert!!",
                            "This feature requires wi-fi or internet connection.",
                            mContext);
                }
            }
            private class HelloWebViewClient extends WebViewClient {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            }
            Dialog dialog;
        }

1
我不想为我自己制作的HTML页面打开弹出窗口,但如果我在某些网站页面上单击链接并且该链接打开一个新窗口,则我也希望在新窗口中打开该页面。 - Vikalp
@Vikalp:你能解决弹出窗口的问题吗?我无法在WebView中打开弹出窗口!如果有人解决了在WebView中显示弹出窗口的问题,请发布解决方案。 - Rajeev Sahu
@user1182217:经过漫长的三年,你让我想起了那些日子。那些才是真正的日子啊。好了,不说这些了,我已经回答了自己的问题。 - Vikalp

0
如果有人在尝试在webview中打开js弹出框时遇到弹出框无法打开或者屏幕变黑的问题,请尝试更改webview的高度和宽度,例如:
android:layout_width="fill_parent"
android:layout_height="fill_parent"

或者

 android:layout_width="match_parent"
android:layout_height="match_parent"

像这样:

<WebView
 android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

0

只有变化

android:layout_width="match_parent"
android:layout_height="match_parent"

android:layout_width="fill_parent"
android:layout_height="fill_parent"

所有弹出窗口将会出现....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接