История просмотра WebView без перенаправления

Я реализовал андроид webview и метод onKeyDown для обратного ключа. (Он реализует webview.goBack(); )

Моя проблема точно подобна вопросу в этом сообщении ниже (нет ответов там)

Как управлять стеком истории Android / назад?

ПРОБЛЕМА. Когда я webview кнопку «Назад», webview выбирает предыдущий URL-адрес, но если этот URL-адрес фактически является перенаправлением, он переходит в этот порочный цикл / цикл. Если вы посмотрите на браузер Chrome или броузер, он правильно обрабатывает спину, не возвращаясь к переадресации.

Как это можно решить?

Пример: перейдите на сайт gap.com. Затем выберите «My Gap Credit Card». Это открывает ссылку перенаправления, а затем последнюю страницу. Теперь, когда я нажимаю, он никогда не попадает на домашнюю страницу Gap.com.

Какие-либо предложения…

Дополнительная информация: Я реализовал shouldOverrideUrlLoading . Если я удалю этот метод, он работает нормально, но с этим методом он не …

Я только что проверил это на желе и, похоже, сработал.

По сути, всякий раз, когда новый 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); } } 

Я надеюсь, что этот ответ, если кто-то все еще ищет его. Я пытался найти похожие проблемы в своем проекте и пытался использовать несколько подходов, таких как использование – 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 и, следовательно, высмеивает поведение webview. В то же время вы убедитесь, что для параметра isBackPressed установлено значение false после завершения загрузки страницы. Надеюсь это поможет !!