2014-04-29 18 views
22

Kiedy wywołuję findFragmentById() z id mojego fragmentu, zwraca on null. Pozwól, że pokażę ci kod.findFragmentById return null

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> 

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(); 
} 

Chodzi o to, że gdy zgłoszę fm.findFragmentById(R.id.login_fragment); uzyskać zerowy ale gdy zgłoszę fm.findFragmentById(R.id.main_fragment); pojawia się fragment .

+0

opublikować kompletny rejestr awarii i kod fragment – Libin

+1

Dzięki za szybką odpowiedź, znalazłem rozwiązanie (korzystałem z support.v4 w jednym fragmencie, a normalny w drugim) Nie mogę opublikować rozwiązania w tej chwili, ponieważ nie mam 10 reputacji, ale odpowiem sobie jutro. Trochę przeszukuję i nie znalazłem nic z tym związanego. – Kar0t

+0

Podejrzewam, że to może być problem. W każdy sposób to znalazłeś. Dobry – Libin

Odpowiedz

27

właśnie się dowiedziałem, że popełniłem błąd.

W moim MainActivity.java importowałem android.support.v4.app.Fragment;, a na moim LoginFragment.java importowałem android.app.Fragment;. Zmieniłem go na to samo i teraz fm.findFragmentById(R.id.login_fragment) zwraca właściwy fragment.

+0

Zmarnowałem cały dzień próbując znaleźć odpowiedź na podobny problem, dzięki – ppp

+0

@AnPel po prostu zrobił to samo, spędził 4 godziny na tym, lol. – Benten

+2

Dzięki za wgląd. W moim przypadku użycie getSupportFragmentManager() zamiast getFragmentManager() rozwiązało problem, ponieważ mój bazowy fragment pochodził z pakietu wsparcia. –

60

Odpowiedź Kar0t jest całkowicie w porządku, ale to może pomóc komuś. W moim przypadku miałem fragment wewnątrz fragmentu i otrzymałem niewłaściwy FragmentManager. Po prostu musiałem zadzwonić:

getChildFragmentManager()

a potem po prostu znaleźć fragment jak zwykle:

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

Ja też walczyłem. Dziękuję bardzo! –

+1

Bardzo dziękuję za pomoc! –