Android WebView пустое URL нового окна на относительных ссылках - PullRequest
0 голосов
/ 02 ноября 2018

Я реализовал пользовательский WebView с включенным setSupportMultipleWindows(). Таким образом, у меня также есть пользовательский WebChromeClient, который переопределяет onCreateWindow()

В большинстве случаев я использовал следующий фрагмент для получения URL-адреса страницы в новом окне (т. Е. Через target:_blank):

Message href = view.getHandler().obtainMessage();
view.requestFocusNodeHref(href);

String url = href.getData().getString("url");

Есть пустые проверки на месте, но для простоты я удалил их в приведенном выше фрагменте. Теперь проблема в том, что иногда данные Bundle (возвращаемые через getData()) имеют нулевой URL для относительных ссылок (т.е. href="/somepage" вместо href="https://www.example.com/somepage/").

Итак, я искал на SO и нашел другое возможное решение:

WebView.HitTestResult result = view.getHitTestResult();
String url = result.getExtra();

Однако это также возвращает ноль. Если я получаю тип данных, используя result.getType(), он возвращает 0, что соответствует UNKNOWN_TYPE .`

Я не уверен, почему он возвращает null для вышеупомянутых методов. Нотабене что если я отключу поддержку нескольких окон, те же ссылки будут работать нормально. Отключение такой поддержки, однако, не вариант. Есть ли другой способ получить URL из onCreateWindow()?

1 Ответ

0 голосов
/ 10 ноября 2018

Я не проверял это, но вы можете попробовать следующее:

 @Override
    public boolean onCreateWindow(WebView view, boolean isDialog,
            boolean isUserGesture, Message resultMsg) {
        Logger.d(Constants.TAG, "onCreateWindow"+resultMsg);
        WebView targetWebView = new WebView(getActivity()); // pass a context
        targetWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url,
                    Bitmap favicon) {
                handleWebViewLinks(url); // you can get your target url here
                super.onPageStarted(view, url, favicon);
            }
        });
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(targetWebView);
        resultMsg.sendToTarget();
        return true;
    }

Надеюсь, это решит вашу проблему! (=

...