Università di Salerno - a.a. 2013-2014 1 Frammento rappresenta una porzione dell UI 2 Un acmvity può ospitare vari frammenm I frammenm possono essere inserim e rimossi durante l esecuzione Si possono creare UI con molm frammenm anche in funzione della grandezza dello schermo 1
3 Un frammento è sempre ospitato da un acmvity Un frammento è una sorta di sub- acmvity ha il suo ciclo di vita che è streramente legato a quello dell acmvity es. se l acmvity è in pausa (stato paused del ciclo di vita) lo sono anche tuv i suoi frammenm se l acmvity è in esecuzione (stato resumed ) allora i frammenm possono essere gesmm La porzione di UI occupata dal frammento deve essere specificata nel layout può essere definita dinamicamente 4 Spazio per il frammento 1 Spazio per il frammento 3 App user Interface Spazio per il frammento 2 2
5 Filosofia di progerazione Interfacce utente dinamiche in parmcolare per sfrurare schermi grandi Esempio Mpico App che gesmsce un elenco di elemenm es. Mtoli di armcoli di un giornale Ogni elemento può essere cliccato per essere esaminato es. visualizzazione dell armcolo 6 Si può usare un frammento per l elenco un frammento per la visualizzazione Se lo schermo è piccolo sarà visibile solo uno dei frammenm cliccando un Mtolo si passerà dal frammento Mtoli al frammento visualizzazione Se lo schermo è grande saranno visualizzam entrambi i frammenm 3
7 Creare frammenm 8 Istanziare un oggero Fragment la classe Fragment è simile alla classe AcMvity proprio ciclo di vita 4
Creare frammenm 9 Normalmente dovremo implementare almeno oncreate() Inizializzazione come in un acmvity NON definiamo il layout oncreateview() definiamo il layout. Il metodo deve resmtuire una View facciamo l inflate di un file di layout onpause() il primo metodo chiamato quando il frammento viene eliminato (si dovrebbero rendere permanenm eventuali cambiamenm altrimenm si perdono) Creare frammenm 10 public stamc class ExampleFragment extends Fragment { @Override public View oncreateview(layoutinflater inflater, ViewGroup view, Bundle savedinstancestate) { // Inflate the layout for this fragment View v =inflater.inflate(r.layout.example_fragment, container, false); return v; è l equivalente di setcontentview nella acmvity host view è un oggero che serve a specificare i parametri di layout 5
11 Creare frammenm Un frammento può essere inserito stamcamente nel layout <?xml version="1.0" encoding="up- 8"?> <LinearLayout xmlns:android="hrp://schemas.android.com/apk/res/android" android:orientamon="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name= com.example.news.armclelistfragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.armclereaderfragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout> 12 6
Creare frammenm 13 Oppure dinamicamente a runmme FragmentManager fm= getfragmentmanager(); FragmentTransacMon v = fragmentmanager.begintransacmon(); ExampleFragment fragment = new ExampleFragment(); v.add(r.id.fragment_container, fragment); v.commit(); R.id.fragment_container è un ViewGroup nel layout dell acmvity che individua la porzione dello schermo da dedicare a questo frammento GesMre i frammenm 14 Usiamo il FragmentManager FragmentManager fm= getfragmentmanager(); Iniziamo una transazione FragmentTransacMon v = fragmentmanager.begintransacmon(); EffeRuiamo le operazioni inserire un frammento (già vista) rimuovere un frammento sosmtuire un frammento Commit v.commit(); 7
GesMre i frammenm 15 addtobackstack() per inserire i cambiamenm nel backstack Il backstack considera solo le acmvity dobbiamo gesmre manualmente i frammenm Se non chiamiamo addtobackstack quando premiamo back salteremo i cambiamenm fav con i frammenm non è quello che l utente si aspera Esempi 16 Lifecycle LifeCycleDyn 8
Comunicare con l acmvity 17 Può essere umle comunicare con l acmvity Creare dei metodi di callback Ad es. il frammento può definire un interfaccia public stamc class MyFragment extends Fragment {... // Container AcMvity must implement this interface public interface OnArMcleSelectedListener { public void onarmcleselected(int index);... Comunicare con l acmvity App lista deragli elemenm 18 Frammento lista deve comunicare l elemento selezionato Frammento deragli deve ricevere l informazione Evitare la comunicazione direra fra i frammenm diminuisce la riusabilità 9
Comunicare con l acmvity 19 Frammento A Main AcMvity Frammento B Interfaccia Communicator void respond Implementa Communicator oncreate { A.setCommunicator(this) deraglio(index) { mostra deragli index Portrait AcMvity setcommunicator { communicator = MainAcMvity onitemclick{ MainAcMvity.respond(index) respond(index) { if (landscape) { B.deRaglio(index) else { New acmvity(index) FrammenM e backstack 20 Nuova acmvity per la modalità portrait facilita la gesmone del backstack per le acmvity è automamca FrammenM e backstack i frammenm non vengono inserim nel backstack quando premiamo il pulsante back si ritorna alla precedente acmvity saltando eventuali cambiamenm dell UI dovum all uso dei frammenm se si vuole occorre gesmre il backstack manualmente 10
Esempi 21 Citazioni FrammentiBackstack FragmentCartelle FrammenM Esercizio (avanzato) 22 L app FragmentCartelle umlizza un layout predefinito di 12 cartelle quindi può gesmre al massimo 12 cartelle Scrivere una nuova versione in cui il layout viene costruito dinamicamente creare nuove view (LinearLayout, Frame, etc) LayoutParameters view.add() 11