WebView back history sans redirections

J'ai implémenté la vision du site Android et la méthode onKeyDown pour la clé de retour. (Il implémente webview.goBack(); )

Mon problème est exactement similaire à la question dans cette publication ci-dessous (aucune réponse là-bas)

  • Comment éviter le redémarrage de l'activité lorsque l'orientation change sur Android
  • Octet à l'image Android
  • StringUtils classe ne fonctionne pas dans Android
  • Pourquoi utiliser getCacheDir () sur Android
  • Java.lang.StringIndexOutOfBoundsException lors de la lecture d'une vidéo dans videoView: Android v 4.2.1
  • Définir des composants Android personnalisés à l'aide d'un petit espace de noms?
  • Comment contrôler l'historique / la pile de l'arrière-page Android WebView?

    PROBLÈME – Lorsque je presse le bouton, la webview sélectionne l'URL précédente, mais si cette URL était réellement une redirection, elle se déroule dans ce cercle vicieux. Si vous regardez Chrome ou le navigateur stock, il gère correctement l'arrière sans revenir aux redirections.

    Comment cela peut-il être résolu?

    Exemple: passez à gap.com. Ensuite, sélectionnez "Ma carte de crédit Gap". Cela ouvre un lien de redirection, puis la dernière page. Maintenant, lorsque je clique en arrière, cela ne va jamais à la page d'accueil de Gap.com.

    Aucune suggestion…

    Informations complémentaires: J'ai implémenté shouldOverrideUrlLoading . Si je supprime cette méthode, cela semble fonctionner bien, mais avec cette méthode, il ne fonctionne pas …

  • Robotium. Dans la série de tests, chaque test suivant est affecté par le test précédent
  • Obtenez la valeur de la chaîne de la liste <Chaîne> à la boucle pour l'affichage
  • Modèle de référentiel avec SqlBrite / SqlDelight (base de données hors ligne) et rétrofit (demande Http)
  • L'ajout d'une journée à un calendrier dans Android échoue le 31
  • Communication avec le serveur client Android
  • GetApplicationContext (), getBaseContext (), getApplication (), getParent ()
  • 2 Solutions collect form web for “WebView back history sans redirections”

    Je viens de tester cela sur jellybean et ça semble fonctionner.

    Essentiellement, chaque fois qu'une nouvelle URL est chargée dans le WebView, conservez une copie de l'url.

    Sur la prochaine requête d'URL, doublez-les, nous ne sommes pas déjà sur cette page, si c'est le cas, reviens sur l'historique de la visualisation web d'une autre étape.

    Essentiellement, cela repose sur l'URL passée dans l'étape de priorité qui est l'urne redirigée, plutôt que sur l'urne redirection finale.

     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); } } 

    J'espère que cette réponse sera si quelqu'un le cherche encore. Je cherchais à réparer des problèmes similaires dans mon projet et j'avais essayé de multiples approches, comme l'utilisation de WebView.HitTestResult – Pousser les urs dans la liste – onKeyDown et ainsi de suite … I Pense que la plupart d'entre eux fonctionneraient si votre application consiste uniquement en une vision du Web. Mais mon projet avait une combinaison de native et webview et gère un certain schéma natif.

    Essentiellement trouvé que la clé est la façon dont vous devez remplacer la méthode shouldOverrideUrlLoading. Puisque je voulais que mon application gère certaines des URL et la vision du Web pour gérer certaines des autres, surtout la manipulation du dos. J'ai utilisé un drapeau pour appuyer à nouveau quelque chose comme …

     @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); } } 

    De cette façon, chaque fois qu'il y a une redirection lorsque vous cliquez sur le retour, il renvoie faux et se moque du comportement de la vision du Web. Dans le même temps, vous assurez que l'isBackPressed est défini sur false après la fin de la page. J'espère que cela t'aides !!

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.