0

Ich versuchte viele Lösung nichts funktioniert für mich. Ich habe mein Fragment (MainFragment) erstellt, um es in der Hauptaktivität anzuzeigen. Und in Main Activity verwende ich eine FrameLayout fragen Sie einen fragment_Container. Folgender Code gibt immer null, wenn für meinen MainFragment:getSupportFragmentManager(). FindFragmentById (R.id.fragment_container) gibt null zurück

FragmentManager fm = getSupportFragmentManager(); 

fm.beginTransaction() 
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment") 
    .commit(); 

MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment"); 
+0

Sie könnten 'commitNow()', das ist synchrnous –

Antwort

1

Das Problem ist, weil Sie versuchen, den MainFragment mit der ID zu erhalten:

MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container); 

was falsch ist, weil man nicht sicher sein kann, Was ist das Fragment im Container? Und weil die ID die Container-ID ist, nicht die Fragment-ID.

Sie müssen die MainFragment erhalten, indem den Tag verwenden, die Sie bereits vor im Einsatz haben:

fm.beginTransaction() 
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment") 
    .commit(); 

Hier ist der Tag mainFragment ist. So nennen es durch die Verwendung findFragmentByTag:

MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment"); 

Sie nur findFragmentById verwenden können, wenn Sie das Fragment mit der ID im Layout mit so etwas wie erklärt haben:

<fragment class="com.example.SampleFragment" 
    android:id="@+id/sample_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Dann können Sie das Fragment, das durch seine ID erhalten :

MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.sample_fragment); 

Darüber hinaus können Sie den MainFragment nicht, wenn man es zu erhalten, nachdem das Hinzufügen über FragmentManager wie dies versuchen:

fm.beginTransaction() 
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment") 
    .commit(); 

// This won't work! 
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment"); 

Wenn Sie MainFragment.newInstance() aufrufen, ist der Prozess asynchron, wo das MainFragment noch nicht erstellt wurde. Sie werden also auf null zeigen.

+0

Entschuldigung! MainFragment mainFragment = (MainFragment) fm.findFragmentByTag ("mainFragment"); Ich habe es schon ausprobiert aber trotzdem bekomme ich null mainFragment –

+0

Hast du es gleich nach dem Hinzufügen via FragmentManager aufgerufen? –

+0

Ja! es hat mein Problem gelöst. Ich habe eine Änderung in meinem MainActvity Layout vorgenommen. Ich verwende Fragment anstelle von FrameLayout. Ihre Erklärung hat mir geholfen, es zu lösen. –

Verwandte Themen