2022年4月6日 星期三

Android WebView 連結 target 為 _blank 時,使用系統瀏覽器開啟新視窗

[WebView 內的連結,改成在WebView 內開啟]
WebView 內的連結,預設會用系統瀏覽器開啟新視窗。
要改成在 WebView 內開啟連結,可設定 setWebViewClient。
找到的資料,是說要覆寫 setWebViewClient 內的 shouldOverrideUrlLoading() 方法,改寫網頁載入的處理方式,
但我測試只加 webview.setWebViewClient(new WebViewClient()) 似乎就可以,不過這邊還是採取改寫的方式。
webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        view.loadUrl(url);
        return true;
        //return super.shouldOverrideUrlLoading(view, request);
    }
});

[連結 target 為 _blank 的連結,改成用系統瀏覽器開啟新視窗]
以上處理後,所有連結都會在 WebView 內開啟。
如果想讓 target 為開新視窗的連結,用系統瀏覽器開啟新視窗,
除了 setSupportMultipleWindows 設置為 true,
還須修改 setWebChromeClient 的 onCreateWindow() 方法,
當連結為開新視窗,會經由該方法處理。
webSettings = webview.getSettings();
webSettings.setSupportMultipleWindows(true);//設定可開啟多視窗
webview.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, android.os.Message resultMsg) {
        //view:發起新窗口請求的 WebView
        //isDialog:true,新窗口是對話框。false,一個全尺寸窗口。
        //isUserGesture:true,用戶觸發的,例如點擊連接
        //resultMsg:創建新 WebView 後要發送的消息。resultMsg.obj是一個 WebView.WebViewTransport 物件 
        Log.i("觀察 isDialog", Boolean.toString(isDialog));
        Log.i("觀察 isUserGesture", Boolean.toString(isUserGesture));
        
        WebView newWebView = new WebView(MainActivity.this);
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(newWebView);
        resultMsg.sendToTarget();

        return true;
    }
});
其他:
有找到另一種處理方式,基本可用,但我經由 JavaSript 開啟新視窗時,APP 會發生 crash
webSettings.setSupportMultipleWindows(true);
webview.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg)
    {
        WebView.HitTestResult result = view.getHitTestResult();
        String data = result.getExtra();
        Context context = view.getContext();
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
        context.startActivity(browserIntent);
        return false;
    }
});



參考:



沒有留言:

張貼留言