Orientation change con ActionBar e fragments

November 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 *

ERRORE: il plugin si-captcha.php informa che il supporto GD image non é stato rilevato in PHP!

Contatta il tuo fornitore del servizio di hosting e domada perché il supporto GD image non sia stato abilitato per il PHP.

ERRORE: il plugin si-captcha.php informa che la funzione imagepng non é stata rilevata in PHP!

Contatta il tuo fornitore del servizio di hosting e domada perché la funzione imagepng non sia stata abilitata per il PHP.