Android: evitar la recarga de WebView en Girar

Cuando giro la pantalla, WebView vuelve a cargar toda la página. No puedo tener esto, ya que parte de mi contenido contiene material dynamic / aleatorio. Actualmente, cuando se gira, la pantalla vuelve a cargar la URL original del método loadUrl ().

¿Alguna idea de lo que está mal con mi código?

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; String 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)).restreState(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, String 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

             

Creo que el problema principal es que llamas a web.loadUrl (webURL); también cuando savedInstanceState! = null

EDITAR

Tratar:

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

EDIT2 : también necesita la anulación onSaveInstanceState y onRestoreInstanceState.

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

No se necesita encoding Java. usa esto en tu archivo de manifiesto.

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

me gusta:

         

en la etiqueta (manifiesto)

 android:configChanges="orientation|screenSize" 

en la clase

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

Agregar android:configChanges="orientation|screenSize" en manifiesto funciona para mí

   

No creo que esto funcione más. En mi caso, restablecer el estado usando WebView.restre(Bundle savedInstanceState) aún desencadena una recarga de la url.

Al mirar los documentos para restreState() , verá que dice:

Si se llama después de que WebView haya tenido la oportunidad de generar estado (cargar páginas, crear una lista de retroceso / avance, etc.), puede haber efectos secundarios no deseados.

y

Tenga en cuenta que este método ya no restaura los datos de visualización para este WebView.

Apoyos a @ e4c5 por apuntarme en la dirección correcta en su respuesta

Y, por supuesto, el curso de acción extremo sería evitar que los cambios de orientación desencadenen la destrucción / creación de actividades. La documentación de cómo hacer esto está aquí

Agregue este código en Manifest

  

Como se cita aquí ,

Precaución: a partir de Android 3.2 (nivel de API 13), el “tamaño de pantalla” también cambia cuando el dispositivo cambia entre la orientación vertical y horizontal. Por lo tanto, si desea evitar que se reinicie el tiempo de ejecución debido al cambio de orientación cuando se desarrolla para API nivel 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el valor “screenSize” además del valor de “orientación”. Es decir, debe descartar android: configChanges = “orientation | screenSize”. Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja esta configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo con Android 3.2 o superior).

configuración android:configChanges="orientation|screenSize" en su actividad resolverá este problema.

Además, tome nota de lo siguiente

Recuerde: cuando declara que su actividad maneja un cambio de configuración, usted es responsable de restablecer los elementos para los que proporciona alternativas. Si declara que su actividad maneja el cambio de orientación y tiene imágenes que deberían cambiar entre horizontal y vertical, debe volver a asignar cada recurso a cada elemento durante onConfigurationChanged ().

Reemplazar el método onConfigChange para evitar la recarga de datos en el cambio de orientación

en su actividad en el archivo AndroidMainfest .

 android:configChanges="orientation|keyboardHidden" 

y tener estos también en su configuración de WebView

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

Prueba esto en tu archivo de manifiesto:

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

Coloque esto en la actividad del archivo Manifest.xml:

 android:configChanges="orientation|screenSize" 

Aquí hay un ejemplo:

      

Esta solución funciona bien para mí:

(1) En AndroidManifest.xml agregue esta línea android: configChanges = “teclado | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”

Me gusta esto (y al igual que las respuestas anteriores)

         

(2) Luego, en MainActivity.java, ver 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) y luego:

 @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.restreState(savedInstanceState); }