Android обнаруживает изменение URL веб-просмотра - PullRequest
19 голосов
/ 16 февраля 2012

У меня есть веб-просмотр в моем приложении для Android, и я хочу определить, когда изменяется URL-адрес.

Я хочу использовать это, чтобы скрыть кнопку информации в верхней панели, когда пользователь находится на странице info.php, и показать ее снова, когда его нет на странице info.php.

Я гуглил, но не могу найти работающий код, кто-нибудь может мне помочь?

Ответы [ 10 ]

12 голосов
/ 23 июня 2015

Для тех, кто загружает URL с помощью JavaScript.Есть способ обнаружить изменение URL-адреса с помощью JavascriptInterface.Здесь я использую YouTube, например.Использование JavaScriptInteface имеет асинхронную проблему, к счастью, это просто обратный вызов, так что это будет меньше проблем.Обратите внимание, что аннотация @javascriptinterface должна существовать.

{
    youtubeView.getSettings().setJavaScriptEnabled(true);
    youtubeView.setWebViewClient(mWebViewClient);
    youtubeView.addJavascriptInterface(new MyJavaScriptInterface(),
            "android");
    youtubeView.loadUrl("http://www.youtube.com");

}

WebViewClient mWebViewClient = new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:window.android.onUrlChange(window.location.href);");
    };
};

class MyJavaScriptInterface {
    @JavascriptInterface
    public void onUrlChange(String url) {
        Log.d("hydrated", "onUrlChange" + url);
    }
}
10 голосов
/ 29 мая 2012

Вы можете использовать WebViewClient.shouldOverrideUrlLoading , чтобы обнаружить все изменения URL в вашем WebViewClient

5 голосов
/ 13 апреля 2016

если вы переопределите этот метод WebViewClient, вы сможете обрабатывать изменения URL и изменения URL JavaScript:

public class YXWebViewClient extends WebViewClient {

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    Log.i("Listener", "Start");

}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    Log.i("Listener", "Finish");
   }

}

, а затем в вашем WebView установите WebViewClient

 yxWebViewClient = new YXWebViewClient();
 webview.setWebViewClient(yxWebViewClient);
2 голосов
/ 04 декабря 2017

Метод onPageFinished работает, по крайней мере, в современных WebViews.

2 голосов
/ 01 августа 2013

Попробуйте использовать onLoadResource.Он будет вызываться как минимум 1 раз, даже если вы используете JS для изменения своего URL.Но это может быть вызвано не один раз, поэтому будьте осторожны.

1 голос
/ 22 февраля 2019

Я использовал этот метод:

webView.setWebChromeClient(new WebChromeClient()
        {
            @Override public void onProgressChanged(WebView view, int newProgress) {
                if (view.getUrl().equals(mUrl))
                {

                }
                else
                {
                    mUrl = view.getUrl();
                    // onUrlChanged(mUrl) // url changed
                }
                super.onProgressChanged(view, newProgress);
            }
        };
);

mUrl - это поля как String ...

1 голос
/ 28 мая 2018

У меня была такая же проблема.Поэтому я решил эту проблему, переопределив метод public void onPageStarted(WebView view, String url, Bitmap favicon) следующим образом:

 webView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon)
    {
        // Here you can check your new URL.
        Log.e("URL", url);
        super.onPageStarted(view, url, favicon);
    }

 });

Также вы можете переопределить метод public void onPageFinished(WebView view, String url), чтобы получить новый URL в конце процесса загрузки страницы.

1 голос
/ 21 августа 2013

У меня была интересная проблема, которая привела меня к этому вопросу, и я был рад предложить решение, которое может помочь кому-то другому, если они придут таким образом из-за поиска в googlebingyahoo.

mwebVew.reload () не будет подбирать новый URL-адрес, который я хотел загрузить, после того как я вернулся с экрана настроек, где я либо вошел в систему пользователя, либо вышел из него. Он достаточно хорошо обновит общие настройки, но не обновит и не заменит веб-страницу URL. Поэтому после нескольких часов не видя ответа, я попробовал следующее, и это сработало.

mWebView.resumeTimers();

Вот ссылка на документ , если вам нужна дополнительная информация.

Надеюсь, это спасет кого-то другого от боли, через которую я прошел, и рад, что кто-то сказал мне, что я должен реализовать это по-другому.

0 голосов
/ 31 мая 2019

Я знаю, что опоздал на игру, но я сталкивался с этой проблемой снова и снова ... Я наконец нашел решение, которое довольно прямолинейно.Просто переопределите WebViewClient.doUpdateVisitedHistory

override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {
    // your code here
    super.doUpdateVisitedHistory(view, url, isReload)
}

Это работает со всеми изменениями URL, даже с Javascript!

Если это не делает вас счастливыми, тогда я не знаючто будет :) 1008 *

0 голосов
/ 02 августа 2017

Это поможет обнаружить перенаправление, вызванное JavaScript.

WebViewClient mWebViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:window.android.onUrlChange(window.location.href);");            }
    };
    myWebView.setWebViewClient(mWebViewClient);
    }
@JavascriptInterface
public void onUrlChange(String url) {
    Toast.makeText(mContext, "Url redirected",Toast.LENGTH_SHORT).show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...