2014-04-29 15 views
22

Quando chiamo findFragmentById() con l'id del mio frammento, restituisce null. Lascia che ti mostri il codice.findFragmentById return null

L'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> 

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

Il fatto è che quando chiamo fm.findFragmentById(R.id.login_fragment); ottengo nulla, ma quando chiamo fm.findFragmentById(R.id.main_fragment); ottengo il frammento .

+0

Messaggio registro incidente completata e il frammento di codice – Libin

+1

Grazie per la risposta rapida, ho trovato la soluzione (Stavo usando support.v4 in un frammento e il tipo normale nell'altro) Non riesco a pubblicare la soluzione in questo momento, perché non ho 10 reputazioni, ma mi risponderò domani. Ho cercato un po 'prima e non ho trovato nulla relativo a questo. – Kar0t

+0

Sospetto che potrebbe essere il problema. In ogni modo lo hai trovato. Buono – Libin

risposta

27

ho appena scoperto il mio errore.

Nel mio MainActivity.java stavo importando android.support.v4.app.Fragment; e nel mio LoginFragment.java stavo importando android.app.Fragment;. Ho cambiato la stessa cosa e fm.findFragmentById(R.id.login_fragment) ora restituisco il frammento giusto.

+0

Ho sprecato tutto il giorno cercando di trovare una risposta a un problema simile, grazie – ppp

+0

@AnPel ho fatto lo stesso, ho trascorso 4 ore su di esso, lol. – Benten

+2

Grazie per l'intuizione. Nel mio caso l'utilizzo di getSupportFragmentManager() invece di getFragmentManager() ha risolto il problema in quanto il mio frammento sottostante proveniva dal pacchetto di supporto. –

60

La risposta Kar0t è perfettamente soddisfacente, ma questo può aiutare qualcuno. Nel mio caso avevo un frammento all'interno di un frammento e stavo ricevendo il FragmentManager sbagliato. Ho dovuto chiamare:

getChildFragmentManager()

e poi basta trovare il frammento come al solito:

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

Anche io stavo lottando qui. Grazie mille! –

+1

grazie mille per il tuo aiuto! –