2012-04-12 17 views
19

Ho tre frammenti come mostrato nella figura seguente. Ho aggiunto tutti questi tre frammenti in LinearLayout usando il file .xml e quando inizia la mia attività di avvio, carico il layout .xml utilizzando setContentView.

Ho alcuni controlli su fragment2. Cliccando su ognuno si carica il frammento a livello di codice usando FragmentTransaction e il metodo commit. Questi frammenti vengono aggiunti allo schermo ma il problema è frammentato in modo prrammaticamente4 occupano l'intera area dello schermo. Quale può essere il problema?

Nota: su qualsiasi elemento fare clic su f2 Voglio sostituire solo f2 con il nuovo frammento f4. Tieni presente che ho aggiunto f1, f2, f3 al file di layout xml e aggiungendo il nuovo frammento f4 a livello di codice.

enter image description hereSostituire un frammento a livello di codice

+0

Non è chiaro. Alla fine stai mostrando tutti e quattro i frammenti? –

risposta

33

È sempre necessario aggiungere, rimuovere e sostituire i frammenti in modo programmatico. Pertanto suggerisco di sostituire i frammenti F-1, F-2 e F-3 con contenitori come FrameLayout.

Fondamentalmente invece di avere un elemento <fragment/> come F-1, lo si rende un elemento <FrameLayout/>. Poi si esegue una transazione frammento onCreate del FragmentActivity:

Fragment1 f1 = new Fragment1(); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 

Ora, supponiamo di avere fatto questo per F-1, F-2 e F-3. Quindi sostituisci f2 con f4 facendo nuovamente la stessa cosa nel tuo OnClickListener:

public void onClick(View v) { 
    Fragment4 f4 = new Fragment4(); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 
+0

Hai qualche riferimento in modo che io possa fare un esempio da lì? – MobiDev

+1

Ho modificato la mia risposta. Questo dovrebbe sove il tuo problema. – CodePrimate

+1

Grazie. OK quello che capisco è non mettere i frammenti direttamente nel layout xml. Metti framelayouts al posto degli elementi del frammento. E mentre sostituisci f4 con f2 usa il frame di f2. Ho ragione? Puoi dare un sito di riferimento per verificarlo. – MobiDev

2

Mantiene solo FrameLayout come segnaposti per il frammento nell'XML. Nell'OnCreate carica i frammenti nel framelayout. OnClick del frammento, assegna a quel particolare FrameLayout l'id da sostituire con Fragment4.

Problemi correlati