Ответ 1
Вы можете использовать WebViewClient.shouldOverrideUrlLoading для обнаружения всех изменений URL в вашем WebViewClient
У меня есть веб-просмотр в моем приложении для Android, и я хотел бы определить, когда изменяется URL-адрес.
Я хочу использовать это, чтобы скрыть кнопку информации в верхней панели, когда пользователь находится на странице info.php, и показать ее снова, когда его нет на странице info.php.
Я гуглил, но не могу найти работающий код, кто-нибудь может мне помочь?
Вы можете использовать WebViewClient.shouldOverrideUrlLoading для обнаружения всех изменений URL в вашем WebViewClient
Для этого 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);
}
}
Я знаю, что опоздал на игру, но я сталкивался с этой проблемой снова и снова... Я наконец нашел решение, которое довольно прямолинейно. Просто переопределите WebViewClient.doUpdateVisitedHistory
override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {
// your code here
super.doUpdateVisitedHistory(view, url, isReload)
}
Он работает со всеми изменениями URL, даже с JavaScript!
Если это не делает тебя счастливым, тогда я не знаю, что будет :)
если вы переопределите этот метод 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);
Попробуйте использовать onLoadResource
. Он будет называться как минимум 1 раз, даже если вы используете
JS, чтобы изменить ваш URL. Но это можно назвать более одного раза, поэтому будьте осторожны.
Метод onPageFinished работает, по крайней мере, в современных WebView.
У меня возникла интересная проблема, которая привела меня к этому вопросу и с удовольствием предоставила решение, которое может помочь кому-то другому, если они придут сюда из-за поиска googlebingyahoo.
mwebVew.reload() не получит новый URL, который я хотел бы загрузить, как только я вернусь с экрана предпочтений, где я либо вошел в систему пользователя, либо вышел из системы. Он будет достаточно хорошо обновлять общие настройки, но не обновлять и не заменять веб-страницу URL-адреса. Поэтому, после нескольких часов отсутствия ответа, я попробовал следующее, и это сработало с большим удовольствием.
mWebView.resumeTimers();
Вот ссылка на doco, если вы хотите получить дополнительную информацию.
Надеюсь, что это спасет кого-то боль, через которую я прошел, и рад, что кто-то скажет мне, что я должен реализовывать ее по-другому.
У меня такая же проблема. Поэтому я решил эту проблему, переопределив 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 в конце процесса загрузки страницы.
Я использовал этот метод:
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
...
Это поможет обнаружить перенаправление, вызванное 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();
}