Мертвая петля в андроидном веб-браузере backkey для перенаправления href link
Я попал в мертвую петлю в приложении Android для веб-браузера с backkey, имея дело с переадресацией ссылок.
Например, когда мой веб-просмотр запущен, он переходит в link0.
В link0 есть ссылка href, которая ссылается на link1. Link1 отредактировать ссылку2.
Итак, если я нажму link1, он перейдет в link1, а затем перенаправит ссылку2. Когда я нажимаю backkey, он должен вернуться к link0, в моем случае. Но вместо этого он переходит к link1, который снова перенаправляется обратно в link2. Поэтому у меня никогда не было шанса вернуться.
Обратный ключ работает правильно с другими ссылками, если они не перенаправляют ссылки.
Я искал веб-страницы для помощи, но не нашел связанных вопросов.
Кстати, backkey работает в интернет-браузере, как и ожидалось. Но не в веб-просмотре.
Ниже мой код, чтобы вы могли попробовать. Как вы можете видеть в коде, я попробовал как onBackPressed, так и onKeyDown, но работает более сложный.
Спасибо за вашу любезную помощь. Я немного борюсь за это.
=============================================== ===================================
public class MyActivity extends Activity
{
private WebView myWebView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myWebView = (WebView) findViewById(R.id.webview);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadUrl("http://50.112.242.120/temp/");
myWebView.setWebViewClient(new MyWebViewClient());
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
myWebView.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn't the Back key or there no web page history, bubble up to the default
// system behavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
}
.
// main.xml
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
Ответы
Ответ 1
webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(tag, "url = " + url);
// view.loadUrl(url);
// return super.shouldOverrideUrlLoading(view, url);
return false;
}
});
смотрите!!!! важно, shouldOverrideUrlLoading должен возвращать false
in shouldOverrideUrlLoading вы не можете вызвать view.loadUrl.
Ответ 2
shouldOverrideUrlLoading()
вызывается для каждого URL-адреса. Итак, если http://site1.com/ перенаправляется на http://site2.com/, который затем перенаправляется на http://site3.com/, вы вызываете WebView.loadUrl()
для каждого из этих URL. Таким образом, каждый из них появляется в заднем стеке.
Вместо создания WebViewClient
вам, вероятно, понадобится WebChromeClient
. WebChromeClient
определяет метод onCreateWindow
, который вызывается только тогда, когда WebView
пытается создать новое окно, а не для каждого URL, к которому он обращается.
Ответ 3
У меня была такая же проблема и она была решена. Вот мой ответ.
Когда я нажимаю на первую ссылку (www.new.a), она автоматически перенаправляет другую ссылку (mobile.new.a). Обычно ссылки перенаправляют два или три, и мое решение работает почти на всех ссылках на перенаправление. Я надеюсь, что этот ответ поможет вам с аннулированием перенаправляющих ссылок.
Я, наконец, понял это. Вам нужен WebViewClient с четырьмя API. В WebViewClient должны бытьOverrideUrlLoading(), onPageStarted(), onPageFinished() и doUpdateVisitedHistory(). Все API-интерфейсы, которые вам нужны, это API 1, поэтому не беспокойтесь.
Вот мой ответ. Проверьте это!:)
Ответ 4
Раздражающие переадресации попадают в предысторию. Обнаруживать, когда пользователь загружает загрузку URL-адреса и вместо этого добавляет их обратно.
private List<String> previous = new ArrayList<String>();
private String mLastUrl;
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.i("DebugDebug", "OnPageFinished " + url);
mLastUrl = url;
super.onPageFinished(view, url);
}
});
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
WebView.HitTestResult hr = ((WebView)view).getHitTestResult();
if (hr != null && mLastUrl != null) {
if (previous.isEmpty() || !previous.get(previous.size() - 1).equals(mLastUrl)) {
previous.add(mLastUrl);
}
Log.i("DebugDebug", "getExtra = " + hr.getExtra() + "\t\t Type = " + hr.getType());
}
return false;
}
});
@Override
public void onBackPressed() {
Log.i("DebugDebug", "onBackPressed");
int size = previous.size();
if (size > 0){
webview.loadUrl(previous.get(size - 1));
previous.remove(size - 1);
} else {
super.onBackPressed();
}
}