PDA

Ver la Versión Completa : [ CONSULTA ] No recargar WebView al rotar dispositivo


antmon12
21/02/13, 20:09:46
Tengo un WebView dentro de mi app Android en la que cargo una página web.
Hasta ahí todo va bien pero al rotar el dispositivo éste se vuelve a cargar en lugar de recolocarse que es el comportamiento que quiero que tenga.
Alguna idea?? más que nada es porque es bastante molesto para un usuario que se cargue la página cada vez que rota el dispositivo.
Gracias por adelantado!

ugarte
21/02/13, 21:40:35
El problema es que cuando giras el terminal la aplicación vuelve a pasar por onCreate(), onStart() y onResume(). Evita que pase por ahí cuando gires el terminal.
Imagino que cargas el webView en el onCreate(). Puedes ponerle que solo te lo haga la primera vez, por ejemplo. Es una chapucilla pero lo primero que se me ocurre.

Arasthel
21/02/13, 22:02:33
Si pones esto dentro del acitivty en cuestión en el AndroidManifest.xml debería de evitar que se destruya y vuelva a crear la actividad al girar la pantalla:

android:configChanges="keyboardHidden|orientation|screenSize"

Un saludo.

antmon12
21/02/13, 22:09:06
Probaré la xapucilla esa que dices ugarte.
Lo que dices tú, arasthel, lo he probado ya y no me funciona.

ugarte
21/02/13, 23:34:07
Probaré la xapucilla esa que dices ugarte.
Lo que dices tú, arasthel, lo he probado ya y no me funciona.

a mi lo que dice @Arasthel si que me funciona.


<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:configChanges="keyboardHidden|orientation|screenSize"
android:name="com.example.nuevointento.MainActivity"
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>


lo tienes que meter ahí

antmon12
22/02/13, 18:45:43
Pasa que lo que dice arasthel me marca un error por lo tanto no vale.
Alguna otra solución?

Arasthel
22/02/13, 18:59:41
Pues no debería marcártelo. Si estás en una versión anterior a 3.0 igual el "screenSize" no tendria que estar ahí, pero por lo demás...

antmon12
22/02/13, 19:18:59
Podría ser el problema.
Estoy programando para la versión 2.2, aún así, no se os ocurre nada?

kriogeN
22/02/13, 19:24:56
Lo que dice arasthel funciona, pero si estás programando para 2.2 como objetivo quita el screenSize.

ugarte
23/02/13, 17:16:41
Pues he probado el método en una aplicación que hice hace un tiempo y cuando giro la activadad no se me recarga, hasta ahí bien, el problema es que tengo un XML para la posición portrait (vertical) y otro para la landscape (horizontal).
Pues al girar me muestra la portrait y no la landscape.

kriogeN
23/02/13, 18:25:38
Pues he probado el método en una aplicación que hice hace un tiempo y cuando giro la activadad no se me recarga, hasta ahí bien, el problema es que tengo un XML para la posición portrait (vertical) y otro para la landscape (horizontal).
Pues al girar me muestra la portrait y no la landscape.

Si usas el android:configChanges tu Activity no volverá a recargarse, por lo tanto no volverá a ejecutar su setContentView, y por tanto no te cambiará al otro Layout.

Por el contrario, si no lo usas, tu Activity se volverá a recargar, cambiará de Layout al que le corresponda, pero obviamente se tendrán que reiniciar todos los controles y por tanto tu WebView.

Existe una forma para que aún recargando puedas recuperar Views (aunque supongo que no Fragments, a ver si lo pruebo algún día, pero eso es otra historia):

protected void onSaveInstanceState(Bundle state) {
web.saveState(state);
}

Y tu onCreate quedaría así:

public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tulayout);
if (savedInstanceState != null)
((WebView)findViewById(R.id.web)).restoreState(sav edInstanceState);
/*AQUI TODO LO QUE HAGAS*/
}

antmon12
24/02/13, 21:29:17
He puesto un mensaje Log en el onCreate para ver si al rotar volvía a pasar por ahí e incluso con lo que decís del manifiesto sigue recargándose. =S

antmon12
26/02/13, 17:15:19
No consigo hacerlo funcionar.
Alguien puede subir un ejemplo completo??
Gracias! :D

ugarte
27/02/13, 00:29:47
Al final creo que no solucionamos el problema que tenía el creador del tema, y ahora a mi por probar en un proyecto que tenía abandonado tampoco consigo el resultado que quiero.
He encontrado estos dos artículos en castellano, no los he mirado todavía pero cuando tenga un rato lo pruebo. Por si queréis ir mirando algo:
http://androideity.com/2011/10/06/manejando-la-rotacion-de-pantalla-en-android/
http://danielme.com/2012/09/17/rotaciones-de-pantalla-en-android/

Edito, mi proyecto no es con webview, ni los articulos que he puesto pero seguro que os puede ayudar

antmon12
27/02/13, 16:21:12
Según he podido comprobar con las dos páginas que indicaste todo lo nombrado anteriormente para que sea el SO quién controle el cambio de orientación poniendo en el manifiesto android:configChanges="keyboardHidden|orientation" te mantiene por ejemplo los datos introducidos en un editText pero con el webView la página vuelve a cargarse por lo cual esa no es la solución, no obstante pienso que se debe de poder solucionar ese problema.
Vamos pensemos, no puede ser tan difícil!!

antmon12
28/02/13, 20:26:21
Nada?? jajajaja

striker6969
01/03/13, 10:30:11
Yo lo he solucionado de otra forma, seguramente no es la mejor forma pero no conozco otra que funcione correctamente.

Primero:
- Sobreescribiendo el método onRetainNonConfigurationInstance devolvemos la información que quieres conservar.
- Devuelves la información que quieras guardar

@Override
public Object onRetainNonConfigurationInstance(){

//Almacenamos la lista de jugadas
return this.jugadas;

}

Segundo:
- En el onCreate de la activity

Object restore = getLastNonConfigurationInstance();

if (restore != null){

//La interfaz se ha reiniciado por que se ha girado el dispositivo

}else{

//La primera vez que entramos en la activity

}

Espero haber sido de ayuda.

Saludos.

antmon12
01/03/13, 12:15:48
Lo que dices funciona para mantener texto en un editText por ejemplo pero no para que al rotar el dispositivo simplemente se reorganice el webview en lugar de recargarse.