История просмотра WebView без перенаправления
Я реализовал андроидный веб-просмотр и метод onKeyDown для обратного ключа. (Он реализует webview.goBack();
)
Моя проблема точно подобна вопросу в этом сообщении ниже (нет ответов там)
Как управлять стеком истории Android/назад?
ПРОБЛЕМА. Когда я нажимаю кнопку "Назад", webview
выбирает предыдущий URL-адрес, но если этот URL-адрес был фактически перенаправлен, он переходит в этот порочный цикл/цикл. Если вы посмотрите на браузер Chrome или броузер, он правильно обрабатывает спину, не возвращаясь к переадресации.
Как это можно решить?
Пример: перейдите в gap.com. Затем выберите "My Gap Credit Card". Это открывает ссылку перенаправления, а затем последнюю страницу. Теперь, когда я нажимаю назад, он никогда не попадает на домашнюю страницу Gap.com.
Любые предложения...
Дополнительная информация: Я реализовал shouldOverrideUrlLoading
. Если я удалю этот метод, он работает нормально, но с этим методом он не...
Ответы
Ответ 1
Я только что проверил это на желе и, похоже, сработал.
По существу, всякий раз, когда новый URL-адрес загружается в WebView, сохраняйте копию URL-адреса.
В следующем запросе URL дважды проверьте, что они еще не на этой странице, если они есть, а затем вернитесь в историю веб-просмотра еще на один шаг.
По сути, это полагается на URL, переданный в этап переопределения, являющийся перенаправленным URL-адресом, а не конечным перенаправленным URL-адресом.
public class MainActivity extends Activity {
private Button mRefreshButton;
private WebView mWebView;
private String mCurrentUrl;
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mRefreshButton = (Button) findViewById(R.id.refresh);
mRefreshButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWebView.reload();
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(mCurrentUrl != null && url != null && url.equals(mCurrentUrl)) {
mWebView.goBack();
return true;
}
view.loadUrl(url);
mCurrentUrl = url;
return true;
}
});
mWebView.loadUrl("http://www.gap.com/");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch(keyCode) {
case KeyEvent.KEYCODE_BACK:
if(mWebView.canGoBack()){
mWebView.goBack();
return true;
}
break;
}
}
return super.onKeyDown(keyCode, event);
}
}
Ответ 2
Я надеюсь, что этот ответ, если кто-то все еще ищет его. Я пытался найти похожие проблемы в своем проекте и пытался использовать несколько подходов, таких как использование
- WebView.HitTestResult
- Нажатие URL-адресов в список
- onKeyDown и так далее...
Я думаю, что большая часть этого будет работать, если ваше приложение состоит только из веб-браузера. Но мой проект имел комбинацию native и webview и обрабатывал некоторую собственную схему.
По существу установлено, что ключ - это то, как вы переопределяете метод shouldOverrideUrlLoading. Так как я хотел, чтобы мое приложение обрабатывало некоторые URL-адреса и веб-просмотр, чтобы обрабатывать некоторые из других, особенно обратную обработку. Я использовал флаг для обратных нажатий, например...
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mClient.setIsBackPressed(true);
//mClient is an instance of the MyWebviewClient
mWebView.goBack();
} else {
super.onBackPressed();
}
}
public class MyWebviewClient extends WebViewClient {
private Boolean isBackPressed = false;
public void setIsBackPressed(Boolean isBackPressed) {
this.isBackPressed = isBackPressed;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isBackPressed){
return false;
}
else {
// handle the url by implementing your logic
return true;
}
}
@Override
public void onPageFinished(WebView view, String url) {
isBackPressed = false;
super.onPageFinished(view, url);
}
}
Таким образом, всякий раз, когда есть переадресация, когда вы нажимаете назад, тогда он возвращает false и, следовательно, высмеивает поведение веб-представления. В то же время вы убедитесь, что для параметра isBackPressed установлено значение false после завершения загрузки страницы.
Надеюсь, это поможет!