Android – Empêcher le rechargement de WebView sur Rotate

Lorsque je fais pivoter mon écran, WebView recharge toute la page. Je ne peux pas avoir cela car une partie de mon contenu contient du matériel dynamic / aléatoire. Actuellement, en rotation, l’écran recharge l’URL d’origine à partir de la méthode loadUrl ().

Une idée de ce qui ne va pas avec mon code?

MainActivity.java

package com.mark.myapp; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { WebView web; Ssortingng webURL = "http://www.google.co.uk/"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) ((WebView)findViewById(R.id.web)).restoreState(savedInstanceState); web = (WebView) findViewById(R.id.web); web.getSettings().setJavaScriptEnabled(true); web.loadUrl(webURL); web.setPadding(0, 0, 0, 0); web.getSettings().setLoadWithOverviewMode(true); web.getSettings().setUseWideViewPort(true); web.getSettings().setSupportZoom(true); web.getSettings().setBuiltInZoomControls(true); web.setWebViewClient(new HelloWebViewClient()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } private class HelloWebViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView web, Ssortingng url) { web.loadUrl(url); return true; } } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack(); return true; } return super.onKeyDown(keyCode, event); } } 

AndroidManifest.xml

             

Je pense que le problème principal est que vous appelez web.loadUrl (webURL); aussi quand savedInstanceState! = null

MODIFIER

Essayer:

 if (savedInstanceState == null) { web.loadUrl(webURL); } 

EDIT2 : Vous avez également besoin du remplacement onSaveInstanceState et onRestoreInstanceState.

 @Override protected void onSaveInstanceState(Bundle outState ) { super.onSaveInstanceState(outState); web.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); web.restoreState(savedInstanceState); } 

Aucun codage Java nécessaire. utilisez ceci dans votre fichier manifeste.

  android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 

comme:

         

en tag (manifeste)

 android:configChanges="orientation|screenSize" 

en classe

 @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); } 

Ajouter android:configChanges="orientation|screenSize" dans le manifeste fonctionne pour moi

   

Je ne crois pas que cela fonctionnera plus. Dans mon cas, la restauration de l’état à l’aide de WebView.restore(Bundle savedInstanceState) déclenche toujours un rechargement de l’URL.

En regardant les documents pour restoreState() vous verrez qu’il est écrit:

S’il est appelé après que WebView ait eu une chance de générer l’état (chargement des pages, création d’une liste retour / avant, etc.), il peut y avoir des effets secondaires indésirables.

et

Veuillez noter que cette méthode ne restaure plus les données d’affichage pour cette WebView.

Props à @ e4c5 pour m’avoir orienté dans la bonne direction dans sa réponse

Et bien sûr, la ligne de conduite extrême serait d’empêcher les changements d’orientation de déclencher la destruction / création d’activité. La documentation pour savoir comment faire est ici

Ajoutez ce code dans Manifest

  

Comme cité ici ,

Attention: à partir d’Android 3.2 (API niveau 13), la “taille de l’écran” change également lorsque l’appareil bascule entre les modes portrait et paysage. Ainsi, si vous souhaitez empêcher les redémarrages à cause du changement d’orientation lors du développement de l’API de niveau 13 ou supérieur (déclaré par les atsortingbuts minSdkVersion et targetSdkVersion), vous devez inclure la valeur “screenSize” en plus de la valeur “orientation”. C’est-à-dire que vous devez choisir Android: configChanges = “orientation | screenSize”. Toutefois, si votre application cible le niveau API 12 ou inférieur, votre activité gère toujours cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même sur un périphérique Android 3.2 ou supérieur).

android:configChanges="orientation|screenSize" définissez android:configChanges="orientation|screenSize" sur votre activité, cela résoudra ce problème.

Prenez également note de ce qui suit

N’oubliez pas: lorsque vous déclarez votre activité pour gérer une modification de configuration, vous êtes responsable de la réinitialisation des éléments pour lesquels vous fournissez des alternatives. Si vous déclarez votre activité pour gérer le changement d’orientation et que vos images doivent changer entre paysage et portrait, vous devez réaffecter chaque ressource à chaque élément lors de la configuration onConfigurée ().

Remplacer la méthode onConfigChange pour éviter de recharger des données lors du changement d’orientation

sur votre activité dans le fichier AndroidMainfest .

 android:configChanges="orientation|keyboardHidden" 

et les avoir aussi dans vos parameters WebView

 webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); webview.loadUrl("Your URL To Load"); 

Essayez ceci dans votre fichier manifeste:

 android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 

Placez-le dans l’activité du fichier Manifest.xml:

 android:configChanges="orientation|screenSize" 

Voici un exemple:

      

Cette solution fonctionne bien pour moi:

(1) Dans AndroidManifest.xml, ajoutez cette ligne android: configChanges = “keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”

Comme ça (et comme les réponses ci-dessus)

         

(2) Puis dans MainActivity.java verify savedInstanceState

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainContext = getApplicationContext(); ---- myWebView = (WebView) findViewById(R.id.webView); prepareWebView(); myWebView.addJavascriptInterface(myJavaScriptInterface, "WEB2Android"); if (savedInstanceState == null) { myWebView.post(new Runnable() { @Override public void run() { myWebView.loadUrl("http://www.appbiz.ro/foto_konta"); } }); } ---- } 

(3) puis:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override protected void onSaveInstanceState(Bundle outState ) { super.onSaveInstanceState(outState); myWebView.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); myWebView.restoreState(savedInstanceState); }