Android обнаруживает изменение URL веб-просмотра

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

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

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

Ответ 2

Для этого 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);
    }
}

Ответ 3

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

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

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

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

Ответ 4

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

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);

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

mWebView.resumeTimers();

Вот ссылка на doco, если вы хотите получить дополнительную информацию.

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

Ответ 8

У меня такая же проблема. Поэтому я решил эту проблему, переопределив 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 в конце процесса загрузки страницы.

Ответ 9

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

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...

Ответ 10

Это поможет обнаружить перенаправление, вызванное 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();
}