2012-05-31 16 views
49

Sto definendo un ID per il mio frammento nel layout xml:findFragmentById restituisce sempre null

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/test_fragment" 
... 

poi aggiungo questo frammento di metodo onCreate della propria attività:

MyFragment myFragment = new MyFragment(); 
fragmentTransaction.add(R.id.fragment_container, myFragment); 
fragmentTransaction.commit(); 

Questo è tutto lavoro bene. Sostituire i frammenti e funziona anche.

tardi sto cercando di recuperare il frammento dal suo ID in uno dei metodi della propria attività:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment); 

In questo modo porta a myFragment essere null. Sempre.

Quando provo a fare lo stesso con i tag al posto di ID posso recuperare il frammento dal suo tag senza problemi:

MyFragment myFragment = new MyFragment(); 
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment"); 
fragmentTransaction.commit(); 

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment"); 

Perché non è possibile findFragmentById trova il frammento, ma findFragmentByTag lo fa? Mi sto perdendo qualcosa?

+0

Provare '(MyFragment) getFragmentManager(). FindFragmentById (R.id.container);' – offset

risposta

37

R.id.test_fragment non è l'ID del frammento, ma l'id del vostro LinearLayout

Calling add(int containerViewId, Fragment fragment) aggiungerà un frammento senza tag. Quindi o si utilizza add(int containerViewId, Fragment fragment, String tag) e si ottiene indietro il vostro frammento utilizzando il tag (come ID)

+15

Questa soluzione è valida ma non ha risposto alla domanda. Dai un'occhiata ai documenti per una descrizione corretta. I documenti dicono che l'ID viene assegnato quando si gonfia il frammento da xml o è l'id contenitore quando viene aggiunto utilizzando una transazione ... http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int) – speedynomads

+0

Vedere questa risposta per una buona descrizione sull'assegnazione programmatica degli id: http://stackoverflow.com/a/13241629/857681 – speedynomads

+5

Se un frammento viene aggiunto senza un id, non lo si può trovare usando l'id del contenitore è collocato? Sono abbastanza sicuro che sia una cosa. –

3
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/test_fragment" 

dovrebbe essere una non fragment un LinearLayout

<fragment android:name="com.example.yourfragment" 
      android:id="@+id/test_fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
+0

Quindi, cosa devo cambiare? Non riesco a definire il mio layout con come nodo superiore. Non riesco ad aggiungere i frammenti nel layout xml dell'attività poiché devo rimuoverli in seguito. – Viper

+1

vedere la modifica ... – Blackbelt

+0

Ok di quanto non sia possibile definire il frammento nel layout. Se è necessario riattivare il linerarlayout, è necessario utilizzare il parametro inflater in onCreateView – Blackbelt

1

Oppure, si dovrebbe avere invece utilizzato:

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container); 
9

Utilizzare il tag <FrameLayout> come un contenitore nel file di layout . Successivamente per sostituire dinamicamente i frammenti dell'attività, è possibile utilizzare l'ID del contenitore <FrameLayout> per sostituire i frammenti nella propria attività.

<FrameLayout 
      android:id="@+id/test_fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
+0

Ha funzionato per me! –

-1

fragmentTransaction.add (R.id.fragment_container, myFragment);

MyFragment myFragment = (MyFragment) getFragmentManager(). FindFragmentById (R.id.test_fragment);

Si prega di notare la differenza.

Si dovrebbe passare R.id.fragment_container come argomento di findFragmentById, come si passa alla funzione di aggiunta, invece di R.id.test_fragment

proposito, secondo l'applicazione interna delle due funzioni, dovrebbe essere giusto che l'ID può essere quello della sua vista del contenitore.

3

stavo usando android.support.v4.app.Fragment nel mio layout durante la chiamata getFragmentManager() che in realtà cercato android.app.Fragment sottoclassi e ho avuto null. Quindi la soluzione era chiamare getSupportFragmentManager().

In generale, assicurarsi che il pacchetto di un frammento che si sta sottoclasse e che utilizza nel proprio layout sia lo stesso restituito dal corrispondente FragmentManager che esegue la ricerca.

0
FragmentB fragmentB = 
(FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); 

if(fragmentB != null) 
{ 
    fragmentB.showuserResponse(msg); 
} 

Utilizzare id contenitore come ID frammento. E quindi verificare il riferimento null.

Problemi correlati