2012-12-17 6 views
52

Ho un layout che include un frammento come segue:Come ottenere un frammento aggiunto in un file XML di layout

<fragment 
     android:id="@+id/mainImagesList" 
     android:name="com.guc.project.ImagesList" 
     android:layout_width="match_parent" 
     android:layout_height="62dp" 
     android:layout_below="@+id/addimagebutton" 
     android:layout_weight="1" 
     android:paddingTop="55dp" /> 

ora, ho bisogno di ottenere questo frammento e gettalo via in modo da poter manipolare e gli aggiornamenti apparire. Come posso farlo ?!

EDIT: Penso di essere riuscito a ottenere il frammento, ma quando cambio alcune variabili, le modifiche non vengono visualizzate!

+0

Se le modifiche non vengono visualizzate, prova a chiamare [invalidate ()] (http://developer.android.com/reference/android/view/View.html#invalidate()) sulla tua vista per ottenere le eventuali modifiche ridisegnate. –

risposta

94

è possibile ottenere l'istanza frammento come segue:

getSupportFragmentManager().findFragmentById(R.id.yourFragmentId) 
1

È possibile trovare il frammento utilizzando findFragmentById (se si conosce il componente è incluso in) o findFragmentByTag (se si conosce il suo tag)

Non so quali variabili si desidera aggiornare, ma si può sostituire il frammento con un altro frammento usando l'API FragmentTransaction.

Vedere http://developer.android.com/guide/components/fragments.html per esempi.

+0

ha funzionato il trucco sostitutivo. Grazie – ahmed

5

Ho fatto esattamente lo stesso in Android e il modo più semplice per farlo utilizzando le interfacce. Ho avuto un'attività con 6 frammenti e avevo bisogno di aggiornare solo 3 di loro.

Io uso questo

final Integer numeroFragments = ((PagerAdapterOfe) mViewPager.getAdapter()).getCount(); 

    for (int i=0; i<numeroFragments; i++) { 
     Object fragment = ((PagerAdapterOfe) mViewPager.getAdapter()).getItem(i); 

     // If the fragment implement my interface, update the list 
     if (fragment instanceof IOfertaFragment){ 
     ((IOfertaFragment) fragment).actualizaListaOfertas(); 
     } 
    } 

Dove, PageAdapterOfe è il mio adattatore frammenti di attività. Ciclo tutti i miei frammenti e cerco quelli che implementano la mia interfaccia, quando ne ho trovato uno, eseguo il metodo definito dalla mia interfaccia e cioè!

Io uso questo codice all'interno dell'attività che contiene tutti i frammenti, in risposta a un segnale di trasmissione, puoi metterlo dove ti serve.

L'interfaccia:

public interface IOfertaFragment { 

    public void actualizaListaOfertas(); 
} 
+0

PERFETTO, funziona come un fascino – ahmed

+0

Questo funziona, ma per essere al sicuro dovresti usare i tag dei frammenti invece del ciclo. –

7

Se il frammento è incorporato in un altro frammento, è necessario getChildFragmentManager ma non getFragmentManager. Per esempio, nel layout XML definiscono il frammento in questo modo:

<fragment 
    android:name="com.aventlabs.ChatFragment" 
    android:id="@+id/chatfragment" 
    android:background="#ffffff" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:layout_marginTop="50dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="5dp" /> 

in codice, è possibile ottenere l'istanza frammento in questo modo:

FragmentManager f = getChildFragmentManager(); 
FragmentTransaction transaction = f.beginTransaction(); 
chatFragment = f.findFragmentById(R.id.chatfragment); 

if (chatFragment != null) { 
    transaction.hide(chatFragment); 
} 
transaction.commit(); 
+1

getChildFragmentManager() lo ha fatto perché avevo un frammento annidato, Grazie fratello – Mrinmoy

Problemi correlati