2014-04-29 15 views
22

Wenn ich findFragmentById() mit der ID meines Fragments aufrufen, gibt es null zurück. Lass mich dir den Code zeigen.findFragmentById gibt null zurück

Die activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

     <fragment android:name="com.madduck.test.app.fragment.MainFragment" 
        android:id="@+id/main_fragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" /> 

     <fragment android:name="com.madduck.test.app.fragment.LoginFragment" 
        android:id="@+id/login_fragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" /> 
</LinearLayout> 

Die MainActivity.java

private static final int LOGIN = 0; 
private static final int MAIN = 1; 
private static final int FRAGMENT_COUNT = MAIN +1; 
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT] 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    FragmentManager fm = getSupportFragmentManager(); 
    fragments[LOGIN] = fm.findFragmentById(R.id.login_fragment); 
    fragments[MAIN] = fm.findFragmentById(R.id.main_fragment); 

    FragmentTransaction transaction = fm.beginTransaction(); 
    for (Fragment f : fragments) { 
     if (f != null) 
      transaction.hide(f); 
     else 
      Log.e(TAG, "???"); 
    } 

    transaction.commit(); 
} 

Die Sache ist die, dass, wenn ich fm.findFragmentById(R.id.login_fragment); nenne ich null bekommen, aber wenn ich fm.findFragmentById(R.id.main_fragment); nennen bekomme ich das Fragment .

+0

Schreiben Sie das komplette Crash-Protokoll und Ihr Fragment Code – Libin

+1

Vielen Dank für Ihre schnelle Antwort, fand ich die Lösung (Ich benutzte support.v4 in einem Fragment und den normalen Typ in dem anderen) Ich kann die Lösung jetzt nicht posten, weil ich keine 10 Reputationen habe, sondern mich morgen selbst beantworten werde. Ich suche ein wenig vorher und habe nichts dazu gefunden. – Kar0t

+0

Ich vermute, dass könnte das Problem sein. Wie auch immer du es gefunden hast. Gut – Libin

Antwort

27

habe gerade meinen Fehler gefunden.

In meiner MainActivity.java importierte ich android.support.v4.app.Fragment; und in meinem LoginFragment.java importierte ich android.app.Fragment;. Ich änderte es auf die gleiche Sache und fm.findFragmentById(R.id.login_fragment) gibt jetzt das richtige Fragment zurück.

+0

Ich verschwendet den ganzen Tag versucht, eine Antwort auf ein ähnliches Problem zu finden, danke – ppp

+0

@AnPel nur das gleiche, verbrachte 4 Stunden darauf, lol. – Benten

+2

Danke für die Einsicht. In meinem Fall löste ich mit Hilfe von getSupportFragmentManager() anstelle von getFragmentManager() das Problem, da mein darunter liegendes Fragment vom Support-Paket stammte. –

60

Die Antwort Kar0t ist völlig in Ordnung, aber das kann jemand helfen. In meinem Fall hatte ich ein Fragment in einem Fragment und ich bekam den falschen FragmentManager. Ich musste einfach anrufen:

getChildFragmentManager()

und dann nur das Fragment wie gewohnt finden:

fm.findFragmentById(R.id.fragment) 
+3

Ich habe auch hier gekämpft. Ich danke dir sehr! –

+1

vielen dank für ihre hilfe! –