Eduard Ereza Martínez
Localitzador de programari

Evita usar onConfigurationChanged

14 d'abril del 2013

Si et desenvolupador d’Android, segurament en algun moment hagis estat temptat d’implementar tu mateix els canvis de configuració en canviar l’orientació de la pantalla. És a dir, afegir el següent atribut a les teves activitats a l’AndroidManifest.xml:

<activity android:name=".LaMevaActivity" 
    android:configChanges="keyboardHidden|orientation|screenSize" />

I llavors sobrecarregant el mètode onConfigurationChanged a la teva activitat:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //el teu codi per gestionar el canvi d'orientació, si cal
}

Bé… Senzillament, NO ho facis. Evita utilitzar aquesta solució, i fes-la servir només com a últim recurs. Com explica la guia de desenvolupadors d’Android:

This technique should be considered a last resort when you must avoid restarts due to a configuration change and is not recommended for most applications.

Com que molt sovint aquest mètode és la solució proposada a molts dels problemes de la recreació de les activitats, i com que ho simplifica tot perquè no t’has d’encarregar de la recreació de l’activitat quan canvia l’orientació, vaig acabar fent-lo servir per a totes les activitats de les meves aplicacions. I llavors, van aparèixer els bugs.

Primer punt: L’ActionBarSherlock té un comportament estrany quan gestiones tu mateix els canvis d’orientació. En el meu cas, tot semblava funcionar, però en els dispositius amb Android <4.0, després de girar la pantalla, les pestanyes de la barra de navegació quedaven totalment congelades i no reaccionaven a cap clic. Com indica Jake Wharton en un dels informes d’errors:

FYI this may never be fully fixed. Avoid handling configuration changes at all costs.

Segon punt: Els AlertDialogs també tenen problemes similars, fins i tot a les últimes versions d’Android. En tenia alguns que, després de diversos canvis d’orientació, també es convertien en “inclicables”. No sé per què, però estic força segur que la causa deu ser la mateixa per la qual l’ActionBarSherlock també es torna “inclicable”.

Així… Què hauries de fer? Bé… simplement, utilitzar la manera normal de gestionar canvis de configuració a les activitats d’Android. És a dir, tenir en compte que la teva activitat pot ser recreada i desant i restaurant-ne l’estat utilitzant els mètodes onSaveInstanceState() i onRestoreInstanceState(), o utilitzant el mètode setRetainInstance() dels fragments. Assegura’t de llegir la guia oficial d’Android per gestionar els canvis de configuració.