9 novembre 2011

Fragments of Android Ice Cream Sandwich

Ed eccomi con una nuova piccola nota sullo sviluppo Android.
Dopo aver finito la mia prima app per Android 2.2, ho pensato bene di renderla compatibile con Android Ice Cream Sandwich e ottimizzarla anche per tablet. Tralasciando i problemi che ha l'emulatore sotto OS X 10.6 (diciamo solo che va una volta su 10 e ha tempi di caricamento biblici -_-), sto comunque avendo delle difficoltà a capire il funzionamento dei Fragment.
I Fragment sono una funzionalità aggiunta in Honeycomb e dovrebbero rendere la gestione dell'interfaccia grafica più semplice per i programmatori. In realtà, essendoci veramente pochi esempi in giro per la rete (personalmente ne ho trovato solo uno replicato all'infinito) risulta difficile capire esattamente come vadano usati. E qui arriviamo all'ultimo di una serie di difficoltà che ho riscontrato nel loro utilizzo.

Volendo inserire un fragment in maniera programmatica all'interno di un Activity, si legge sul sito ufficiale di Android, bisogna utilizzare la classe FragmentTransaction in questo modo:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
peccato che si dimentichino di far notare che all'interno del metodo onCreateView della classe Fragment bisogna definire una View tramite il metodo inflate(int resource, ViewGroup root, boolean attachToRoot) passando false come ultimo parametro, pena il crash dell'applicazione, cioè:
public static class ExampleFragment extends Fragment {
    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup
                                          container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.example_fragment, container,                                              false);
    }
}
Senza impostare il flag a false, la View così creata viene assegnata a root e non può essere richiamata all'interno dell'Activity in cui vorremmo inserire programmaticamente il Fragment e il programma si interrompe con un poco significativo:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Per ora è tutto, ma temo che tornerò presto per colpa di Android 4.
Stay Tuned :)

Nessun commento:

Posta un commento