Question

I have webview in my application and I want it to open pop up windows when clicking on a link inside webview. I have added following code but it didn't work:-

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

That the popup should appear like this

Was it helpful?

Solution

I am answering my own question after 3 long years:

When a link is touched inside a webpage then depending on a webpage implementation there are two possible scenarios: 1) Link will be opened in same window. 2) Link will be opened in new window.

Well Its easy to handle 1st scenario using below code:

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

Overiding shouldOverrideUrlLoading inside WebViewClient implementation will open link in same window.

Now lets look at the 2nd case, where webpage is requesting a url to be open in new window. For this case we need to tell our webview to support multiple windows like below:

webView.getSettings().setSupportMultipleWindows(true);

and then adding a new web chrome client to webview to get event when new window is requested by webpage

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;
            }
        }

    });

Cheers!!!

OTHER TIPS

Add this line to your web view web.addJavascriptInterface(new Jscalls(this), "Android");

Then add this line to your href in html that is loaded in the web view href="javascript:showAndroidToast('Data to be shown or the URL from which data is to be shown')"

   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;
        }

If someone is facing issue like pop is not opening or there is black screen when you are trying to open js pop up in webview. Please try to change height and width of webview like:-

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

OR

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

like this:-

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

only change

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

to

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

all popups will appear ....

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top