2011-08-21 22 views
55

Solo intento adaptar algunas de mis aplicaciones para HoneyComb.android: configChanges = "orientation" no funciona con los fragmentos

El tema I am enfrentando es la destrucción de mi actividad en el cambio de orientación (horizontal/vertical)

Cuando yo estaba usando una actividad clásica, que escribió en el manifiesto:

Pero ahora, todo estas líneas ya no funcionan!

¿Hay alguna solución para eso?

Mi código:

<activity android:name=".TwitterActivity" android:label="@string/app_name" 
     android:configChanges="keyboardHidden|orientation" /> 

    <activity android:name=".TwitterActivity$AppListFragment" 
    android:configChanges="keyboardHidden|orientation" /> 

Respuesta

72

Basado en mi experiencia con Honeycomb 3.0 y biblioteca de compatibilidad (r1).

configChange="orientation" funciona con fragmentos con respecto a la prevención de la actividad (a la que se aplica) siendo recreado con un cambio de orientación. Si desea que el fragment no se vuelva a crear en la recreación de actividades, llame al setRetainInstance en onCreate.

A menos que me falta algo, no obtengo su segunda entrada de manifiesto, ¿no es AppListFragment a Fragment? Si es así, ¿por qué aparece como una entrada en su manifiesto?

Ver SO Answer para los nuevos calificadores que es probable que ser la causa de esto si está apuntan a SDK 13, sugeriría probar android:configChanges="orientation|screenSize"

+0

La segunda entrada de manifiesto es solo una prueba porque estaba muy decepcionado. Puedo prometerle que configurar configchange = "orientation" NO funciona para el fragmento dentro de la actividad. –

+0

@ Profete162 No estoy seguro de lo que quiere decir con "NO funciona para el fragmento dentro de la actividad". El fragmento interno no debería tener ningún impacto en la recreación de la actividad. ¿Cuál es el objetivo de tu SDK? Ver [enlace] (http://stackoverflow.com/questions/6968105/orientation-change-in-honeycomb) para una posible respuesta. – PJL

+0

¡Responde bien, irá a trabajar y probará esta tarde, pero estoy seguro de que tu respuesta será aceptada! –

36

tuve un problema muy similar, pero tuvo que hacer un par de adiciones a conseguir que funcione con varias versiones (incluido ICS).

En la actividad principal de la aplicación agregué una versión ligeramente diferente de lo que Jason ofreció.

<activity 
android:name=".MyMainActivity" 
android:configChanges="orientation|keyboardHidden|screenSize" 
android:label="@string/app_name" > 

Tenía esta trabajando en la pre-nido de abeja con:

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

que tenía que hacer el primer ejemplo para ponerlo en marcha en todas las versiones. Actualmente estoy usando fragmentos y ActionBarSherlock para compatibilidad con versiones anteriores.

También ha cambiado la forma en que estaba ahorrando y recarga:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     // Set up webview object 
     View v = inflater.inflate(R.layout.webview_layout, container, false); 
     webview = (WebView)v.findViewById(R.id.webview_fragment); 
     webview.getSettings().setJavaScriptEnabled(true); 

     // Check to see if it has been saved and restore it if true 
     if(savedInstanceState != null) 
     { 
      if (savedInstanceState.isEmpty()) 
       Log.i(tag, "Can't restore state because bundle is empty."); 
      else 
      { 
       if (webview.restoreState(savedInstanceState) == null) 
        Log.i(tag, "Restoring state FAILED!");  
       else 
        Log.i(tag, "Restoring state succeeded.");  
      } 

     } 
     else 
     { 
      // Load web page 
      webview.setWebViewClient(new MyWebViewClient()); 
      webview.getSettings().setPluginsEnabled(true); 
      webview.getSettings().setBuiltInZoomControls(false); 
      webview.getSettings().setSupportZoom(false); 
      webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
      webview.getSettings().setAllowFileAccess(true); 
      webview.getSettings().setDomStorageEnabled(true); 
      webview.loadUrl(mTabURL);  
     } 
     return v; 
    } 

El código para el método de guardar el estado instancia:

 @Override 
    public void onSaveInstanceState(Bundle outState) 
    { 
     if(webview.saveState(outState) == null) 
      Log.i(tag,"Saving state FAILED!"); 
     else 
      Log.i(tag, "Saving state succeeded.");  
    } 

Espero que esto ayude.

+0

Muchas gracias, esto me ayudó con un problema similar que tuve al actualizar mi aplicación a ICS. –

+0

Me funcionó. Gracias –

34

Hasta API 13 se produjo un nuevo valor a los atributos configChanges, screenSize

Así que si usted está utilizando grandes pantallas asegúrese de añadir ScreenSize en sus configChanges atribuir:

 android:configChanges="orientation|keyboardHidden|screenSize" 
+1

¿ScreenSize hará un Crash en Api <13? –

9

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, debes 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).

1

Sé que esta es una respuesta bastante tardía, pero recientemente me enfrenté a este problema y pude resolver esto para la Actividad de Fragmentos.

1) en el manifiesto,

 android:configChanges="orientation|keyboardHidden|screenSize" 

2) En archivo de clase, anular el onSaveInstanceState (Bundle Outstate). Eso es todo! Disfrutar :)

4

Estaba teniendo el mismo problema (es decir, actividad reiniciando) incluso sin fragmentos.

me cambió:

android:configChanges="orientation|keyboardHidden" 

a:

android:configChanges="orientation|keyboardHidden|screenSize" 

que impiden la actividad se reinicie.

0

En el archivo Manifiesto, dentro de la actividad, agregue esta línea
android: configChanges = "teclado | tecladoHidden | orientación | tamaño de pantalla".

Cuestiones relacionadas