1. 程式人生 > >如何讓安卓WebView支援js呼叫window.open()和window.close()的方法。

如何讓安卓WebView支援js呼叫window.open()和window.close()的方法。

最近專案中遇到一個webview開發時的問題,web前端開發人員在網頁上實現了一個功能。功能是在A html頁面,開啟一個新的B html頁面,然後再B頁面中選擇一個聯絡人,把值返回給A頁面。做web開發的朋友應該知道,這個需要在A中通過window.open()開啟B,在B中選擇完畢和呼叫window.close()關閉B,並且把獲取的值傳遞給A。由於我不是做web開發的,表述可能不是特別對,但是大概就是這麼個意思。js中呼叫window.open(),其實會回撥我們WebChromeClient中的

onCreateWindow(WebView view, boolean isDialog,
                    boolean isUserGesture, Message resultMsg) 方法,我的理解是類似於我們瀏覽器裡面的新開一個視窗一樣。這時候我們需要自己重寫這個方法,在這個方法中通過新建立一個WebView來載入新的網頁地址(當然你不重寫這個方法,其實也能開啟B,但是用的同一個webview載入的B頁面,這時候你在B中呼叫js的window.close(),系統發現當前只有一個視窗,這個就導致window.close()方法沒有任何作用)。具體程式碼如下:
 @Override
            public boolean onCreateWindow(WebView view, boolean isDialog,
                    boolean isUserGesture, Message resultMsg) {//html中呼叫window.open(),會回撥此函式
                DebugUtil.log("建立新視窗:" + isDialog + ";" + isUserGesture + ";"
                        + resultMsg);
                newWebView = new WebView(OAWebActivity.this);//新建立一個webview
                initWebView(newWebView);//初始化webview
                fl_web_activity.addView(newWebView);//把webview載入到activity介面上
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;//以下的操作應該就是讓新的webview去載入對應的url等操作。
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();
                return true;

                // return super.onCreateWindow(view, isDialog, isUserGesture,
                // resultMsg);
            }
重寫這個方法是新建立webview去載入新的地址,類似於新開一個瀏覽器視窗的意思(個人理解)。注意:webview還需要設定如下幾個屬性(紅色部分):

WebSettings webSettings = wv.getSettings();

 webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支援js呼叫window.open方法         webSettings.setAllowFileAccess(true);// 設定允許訪問檔案資料         webSettings.setSupportMultipleWindows(true);// 設定允許開啟多視窗
        webSettings.setDomStorageEnabled(true);//          webSettings.setJavaScriptEnabled(true);// 設定支援javascript 當然既然重寫了建立window的方法,也記得把關閉window的方法重寫一下:
/*
             */
            @Override
            public void onCloseWindow(WebView window) {//html中,用js呼叫.close(),會回撥此函式
                super.onCloseWindow(window);
                DebugUtil.err("關閉當前視窗");
                if (newWebView != null) {
                    fl_web_activity.removeView(newWebView);
                }
            }

其實就是把新的webview移出介面。當然還可以把新建立的webview的資源回收掉,這裡只寫一個思路。