У меня странная проблема с просмотром веб-страниц Android. Я загружаю страницу в веб-просмотр, на котором есть ссылка. Я установил веб-представление, чтобы открыть эту ссылку в том же веб-представлении (не в браузере). Когда открывается следующая страница, она записывает некоторые вещи в MySQL. Если пользователь уже открыл эту вторую страницу в тот же день, он перенаправляется на первую страницу, и в mysql ничего не записывается. Я заметил, что в 1 из 3-4 раз при первой ситуации нажатие на ссылку записывает материал в mysql дважды (с одной и той же временной меткой) и перенаправляет пользователя сразу на первую страницу. Таким образом, кажется, что при нажатии на ссылку URL открывается дважды подряд. Все работает как положено в браузерах моего компьютера (Safari, Firefox и Chrome). Я нашел статью, в которой говорилось, что пустые поля src на изображениях могут вызывать это, но в моем коде php / html нет пустых полей src.
Webview настроен так:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_description);
WebViewClient yourWebClient = new WebViewClient()
{
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
webView.loadUrl("file:///android_asset/404.html");
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
if ( url.contains("google") == false ) {
webView.loadUrl(url);
return false;
}
else {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
return true;
}
}
};
webView = (WebView) findViewById(R.id.description);
webView.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= 11){
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
String url = (MainActivity.URL+"app/description.php?tagid="+tagId+"&screenwidth="+viewPortWidth+"&screenheight="+viewPortHeight+"&deviceid="+MainActivity.myDeviceId+"&lang="+MainActivity.myLanguage+"&os=android);
webView.setWebViewClient(yourWebClient);
webView.loadUrl(url);
}
Моя ссылка — это просто типичный тег внутри тега привязки (написанный на php):
echo '<a href="description.php?type='.$type.'&screenwidth='.$screenWidth.'&screenheight='.$screenHeight.'&tagid='.$tagid.'&no=1&deviceid='.$deviceid.'&lang='.$language.'">
<div class="redbutton">'.$lang['NO'].'</div></a>';
На самом деле только вернуть false, веб-страница будет автоматически загружена в WebView
, Не нужно использовать webView.loadUrl();
,
if ( url.contains("google") == false ) {
return false;
}
Попробуйте и дайте мне знать, если не сработает.
Как Документация состояния —
в то время как return false означает, что текущий WebView обрабатывает URL
Хорошо, я нашел причину для этого. Это было причиной:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
if ( url.contains("google") == false ) {
webView.loadUrl(url);
return false; // <----THIS LINE
}
else {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
return false;
}
}
Это должно было вернуться правда. Я выяснил это, протестировав это:
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
String url_new = view.getUrl();
Log.v("","Webview url: "+url_new);
}
Я заметил, что он выводил URL дважды при каждом нажатии какой-либо ссылки, но этого не происходило при первой загрузке веб-просмотра. Когда я изменил выражение return на true, оно распечатывалось только один раз за клик, как и предполагалось.