Orientation change con ActionBar e fragments

novembre 18, 2012
By

Dato che i fragments sono una guideline fortemente caldeggiata, che ci sono le librerie di compatibilità per i device 2.x e che il progetto su cui lavoro attualmente è mirato esplicitamente sul Nexus7 ho provato a seguire l’approccio dei fragments ed effettivamente ha dei lati interessanti

Un problema che ho avuto è stato quello della persistenza del frammento fra i vari stati del lifecycle.
Ho intercettato l’onResume() del frammento solo che da log e debugger vedevo che veniva richiamato ossessivamente e finivo con la view popolata da un frammento non correttamente impostato (campi vuoti, immagini pure)
Il metodo di aiuto che ho scritto popola una vista partendo da un oggetto deserializzato

Dopo un certo numero di improperi mi sono accorto che il tutorial ufficiale omette una cosa abbastanza importante, o l’ho capita davvero io in modo sbagliato
Il tutorial cui faccio riferimento è questo: http://developer.android.com/guide/topics/ui/actionbar.html#Tabs

Il punto specifico che mi ha dato problemi è questo:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(mFragment);
        }
    }

Questo metodo viene richiamato non solo alla reale selezione del tab, ma anche nei cambi di configurazione e a ben guardare mi sono accorto che continuava ad istanziare i frammenti
Ho quindi aggiunto un controllo appena prima usando un FragmentManager:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
	// Check if the fragment is already initialized
	if (mFragment == null) {
		// If not, instantiate and add it to the activity

==>		mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
		if(mFragment == null){
			mFragment = Fragment.instantiate(mActivity, mClass.getName());
			ft.add(android.R.id.content, mFragment, mTag);
		}
	} else {
		// If it exists, simply attach it in order to show it
		ft.attach(mFragment);
	}
}

Un’altra soluzione è quella che si trova nei samples dell’sdk dentro a ApiDemos/src/com/example/android/apis/app/FragmentTabs.java dove molto banalmente l’actionBar viene definita come final

Oltre a questo c’è da tenere a mente che l’actionBar il proprio stato selezionato non lo porta con sé, va aggiunto a mano all’outState nel onSavedInstanceState e ripristinato nell’onCreate .

 

Tags: , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*