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?
- Imagen "Zoom In / Out" en el botón Haga clic en Android?
- SMS raw pdu en Android
- Almacenamiento y comparación de objetos desde una base de datos
- ¿Algún consejo sobre cómo acelerar esto en Android?
- Adición de fotos a la galería en Google Play Kiosco
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>
- Barra de progreso personalizada para android
- Import android.support no se puede resolver
- Error en Volley Patch
- Estudio androide java.lang.NoClassDefFoundError:
- AudioTrack - matriz corta a la distorsión de la matriz del byte usando jlayer (decodificador del java mp3)
- Ejecutar Android App Error (FATAL EXCEPTION: principal Proceso: PID: 14099)
- ¿Existe una manera de encontrar el tamaño completo de la solicitud HTTP y la respuesta en Android (para el seguimiento del uso de datos)?
- Programación de Android - Publicar formulario de Google / Spreedsheet (REQUIRED FIELD)
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.