В WebView есть ли способ для shouldOverrideUrlLoading определить, перехватывает ли он перенаправление против пользователя, щелкающего по ссылке? - PullRequest
20 голосов
/ 04 октября 2010

Я бы хотел, чтобы перенаправления происходили естественным образом в WebView и перехватывали новый URL, только если это происходит, потому что пользователь что-то нажал.

Ответы [ 6 ]

19 голосов
/ 14 ноября 2012

У меня была похожая проблема.Мне нужно было открыть страницу в WebView в моей деятельности.Однако когда пользователи нажимали на ссылку на странице, я хотел, чтобы она открывалась в «новом окне», что означает активность браузера.Это создает проблему, если страница имеет перенаправление.Для этого я сделал следующее:

  1. Я показываю веб-просмотр только после завершения загрузки страницы.
  2. Я сохраняю логическое значение, сообщающее мне, когда страница закончила загрузку,Взаимодействие с пользователем может происходить только после завершения загрузки страницы.в противном случае это перенаправление и должно быть открыто в моей деятельности.

Пример кода:

private boolean mLoaded = false;

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(mLoaded){ // open in new browser window only if page already finished
        try
        {
            Uri uri = Uri.parse(url);
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            activity.startActivity(intent);
        }
        catch (Exception e)
        {
            Logger.log(e);
        }
    }
    return true;
}

@Override
public void onPageFinished(WebView webView, String url) {
        layoutHoldingTheWebView.setVisibility(View.VISIBLE);
        mLoaded = true;
    }
}
10 голосов
/ 04 октября 2010

Я только что нашел в этом SDK что-то, что могло бы работать, WebView.getHitTestResult () Дайте мне знать, если кто-нибудь видит какие-либо недостатки в этом методе.

Вот пример того, как я его использую:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if(view.getHitTestResult().getType() > 0){
         // From a user click, handle it yourself.
         return true;
    } else {
         // Nothing clicked, assumed to be a redirect, let it redirect.
         return false;
    }
}
8 голосов
/ 04 октября 2010

Не напрямую, нет.

Вы можете использовать комбинацию WebViewClient.onPageStarted и WebView.getOriginalUrl, чтобы попытаться определить, является ли отображаемый URL исходным запрошенным, но это после , когда WebView решил загрузить Url. Это может помочь определить, произошло ли перенаправление, но все равно не будет различать пользовательские события и события сценария, которые не вызывают перенаправления.

Если вы контролируете контент веб-контента, вы также можете кодировать кликабельные пользователем URL-адреса некоторым идентифицируемым способом (например, проприетарной схемой вместо http) и выполнять любую дополнительную обработку, которая вам требуется, если критерии соответствуют shouldOverrideUrlLoading реализация.

2 голосов
/ 03 августа 2017

В SDK 24. можно получить результат по новым shouldOverrideUrlLoading(WebView view, WebResourceRequest request),

В WebResourceRequest есть метод isRedirect(), который определяет, был ли запрос результатом перенаправления на стороне сервера.

1 голос
/ 03 ноября 2015

Адаптировано из ответа Гарретта, потому что я обнаружил, что он не совсем работает, как написано, дал несколько ошибок и т. Д. И часть о видимости, на мой взгляд, не нужна. У меня была та же проблема, что и у ОП, и это дает мне поведение, которое я хочу:

webView.setWebViewClient(new WebViewClient()
    {
        private boolean mLoaded = false;
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(mLoaded){ // open in new browser window only if page already finished
                try
                {
                    Uri uri = Uri.parse(url);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    view.getContext().startActivity(intent);
                }
                catch (Exception e)
                {
                    Log.d("webview", e.getMessage());
                }
                return true;
            }
            else
            {
                return false;
            }
        }

        @Override
        public void onPageFinished(WebView webView, String url)
        {
            mLoaded = true;
        }
    }
0 голосов
/ 18 мая 2015

Вы можете сделать следующее:

@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
    if (webView.getUrl() != null && webView.getOriginalUrl() != null && webView.getOriginalUrl().equalsIgnoreCase(webView.getUrl()) {
        // Not Redirect
    } else {
        // Redirect
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...