Android: evitar la recarga de WebView en rotación

Cuando rota mi pantalla, WebView vuelve a cargar toda la página. No puedo tener esto ya que algunos de mis contenidos contienen material dinámico / 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)).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, 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

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mark.myapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest> 

Creo que el principal problema es que usted llama a web.loadUrl (webURL); También cuando savedInstanceState! = Null

EDITAR

Tratar:

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

EDIT2 : También necesita el override 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.restoreState(savedInstanceState); } 

No necesita codificación java. Utilice esto en su archivo de manifiesto.

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

me gusta:

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.Example.WebviewSample.webviewsample" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

En la etiqueta (manifiesto)

 android:configChanges="orientation|screenSize" 

en la clase

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

Añadiendo android:configChanges="orientation|screenSize" en el manifiesto funciona para mí

 <activity android:name="com.example.HelloWorld.WebActivity" android:label="@string/title_activity_web" android:configChanges="orientation|screenSize" > </activity> 

Solución simplificada que he utilizado yo mismo y podría recomendar está aquí:

http://twigstechtips.blogspot.com/2013/08/android-retain-instance-of-webview.html

Añadir este código en Manifest

 <activity ... android:configChanges="orientation|screenSize"> 

No creo que esto funcione más. En mi caso, la restauración del estado utilizando WebView.restore(Bundle savedInstanceState) aún activa una recarga de la url.

Mirando los documentos para restoreState() , verá que dice:

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

y

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

Props a @ e4c5 por señalarme 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 la actividad. La documentación para saber cómo hacer esto está aquí

Anular el método onConfigChange para evitar recargar 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"); 

Marca, si tienes una pantalla en blanco con esta solución, intenta agregar android:configChanges="orientation|keyboardHidden" en tu actividad en el archivo AndroidMainfest.

  • Android ArrayList tamaño que devuelve 1 incluso si no hay ningún elemento en la lista
  • Visualización de elementos de menú en la barra de acciones de Android ICS
  • ¿Está Android N Stream API backported a versiones inferiores?
  • Twitter aplicación sólo la autenticación java android con twitter4j
  • Cómo extender la actividad de dos clases de Android?
  • Encontrar y Android NSD-Service desde un dispositivo que no sea Android
  • PopupMenu no se encuentra correctamente dentro de RecyclerView
  • Cliente Socket.io android java que recibe mensajes y envía ejemplo de archivo
  • Error de Android NDK ndk-build helloJni
  • Inflater y lazo no funciona como debería
  • Mapbox no se procesa en la presentación XML Vista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.