shouldOverrideUrlLoading не работает/перехватывает клики по ссылкам во время загрузки страницы

Я использую WebViewClient.shouldOverrideUrlLoading для перехвата любых кликов по ссылкам в WebView. Это работает примерно в 95% случаев, но иногда просто не вызывается.

Я заметил это в следующих трех обстоятельствах:

  1. Когда ссылка указывает на страницу, на которой они уже находятся. Это не так уж важно, и для него сообщается ошибка. .
  2. Пока страница все еще загружается, если пользователь нажимает на ссылку, он редко ее ловит. Он просто откроет ссылку, даже не вызывая shouldOverrideUrlLoading.
  3. Случайно. Экспериментируя с этим за последние пару месяцев, я заметил, что иногда он просто не улавливает его. Это редко, но это происходит.

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

Кроме того, я должен упомянуть, что я пробовал разные возвращаемые значения в shouldOverrideUrlLoading и заметил, что всегда возвращаемое значение true дает лучший результат, но проблемы, описанные выше, все еще случаются.


person cottonBallPaws    schedule 26.02.2011    source источник
comment
У меня была аналогичная проблема при попытке изменить веб-страницу с помощью js на странице, которая изменяет window.location. Оказывается, изменение схемы/протокола URL приводит к тому, что веб-просмотр цепляется за shouldOverrideUrlLoading.   -  person Grantland Chew    schedule 08.07.2011
comment
В комментарии к принятому ответу вы говорите, что причина проблемы была в вашей логике. Вы никогда не упоминаете, в чем была настоящая проблема. У меня такая проблема, и судя по гуглю не я один такой. Не могли бы вы уделить минутку и рассказать нам о том, как вы ее решили?   -  person mickey    schedule 02.02.2012
comment
@mickey, спасибо, что указали на это. Прости за это! Я написал ответ ниже. (В принятых ответах комментарии)   -  person cottonBallPaws    schedule 03.02.2012
comment
Нп! Жаль, что моя проблема не похожа на вашу... :(   -  person mickey    schedule 05.02.2012
comment
@mickey, что с тобой происходит? Примерно так, как описано в этом исходном вопросе, или по-другому?   -  person cottonBallPaws    schedule 06.02.2012
comment
Немного по-другому. Но то, что вы пытались сделать, могло оказаться решением моей проблемы. Если у вас есть свободная минутка, вы можете прочитать мой вопрос, он остается без ответа по адресу stackoverflow.com/questions/9147875/ и, по крайней мере, оставить утешительный комментарий;)   -  person mickey    schedule 06.02.2012


Ответы (2)


Если HTML ваш собственный, вы можете заменить все традиционные ссылки вызовами вашего собственного Java-объекта, введенного в WebView через addJavascriptInterface(). Тогда вы больше не будете зависеть от shouldOverrideUrlLoading().

В противном случае, возможно, попытайтесь запретить пользователю взаимодействовать со страницей до onPageFinished().

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

person CommonsWare    schedule 26.02.2011
comment
спасибо за предложения. К сожалению, HTML в этом случае не принадлежит мне, и я не могу заблокировать пользователя, потому что некоторые страницы загружаются некоторое время после того, как они вполне пригодны для использования пользователем. Так что это был бы довольно разочаровывающий опыт пользовательского интерфейса. Для меня это практически 100% воспроизводимость. Загрузите URL-адрес в WebView и, пока он загружается, нажмите ссылку, и он просто пропустит вызов переопределения. - person cottonBallPaws; 03.03.2011
comment
Это оказалось ошибкой в ​​моей логике, которую я не уловил. Я дам вам ответ, потому что у вас все равно есть несколько хороших предложений. Спасибо. - person cottonBallPaws; 08.03.2011
comment
@littleFluffyKitty, о каких недостатках логики вы говорите? Вы должны написать их. - person ThomasW; 14.09.2011
comment
@ThomasW Это было давно, но я почти уверен, что нашел место, где я возвращал ложь. Я считаю, что вы должны абсолютно всегда возвращать true в shouldOverrideUrlLoading(), чтобы избежать этой проблемы. В этом методе, если вы обнаружите, что вам не нужно переопределять загрузку, просто вызовите webview.loadUrl(url) вместо возврата false. - person cottonBallPaws; 03.02.2012

У меня была аналогичная проблема при попытке изменить веб-страницу с помощью js на странице, которая изменяет window.location. Оказывается, изменение схемы/протокола URL приводит к тому, что веб-просмотр цепляется за shouldOverrideUrlLoading. Я знаю, что это не поможет вам, поскольку вы не владеете HTML, но я подумал, что это поможет любому, кто наткнется на эту проблему.

person Grantland Chew    schedule 07.07.2011