GetFragmentManager.findFragmentByTag() restituisce null

        getFragmentManager().beginTransaction()
                .replace(R.id.graph_fragment_holder, new GraphFragment(), "GRAPH_FRAGMENT")
                .commit();

        getFragmentManager().beginTransaction()
                .replace(R.id.list_fragment_holder, new ListFragment(), "LIST_FRAGMENT")
                .commit();

        //getFragmentManager().executePendingTransactions();

        GraphFragment graphFragment = (GraphFragment) getFragmentManager().findFragmentByTag("GRAPH_FRAGMENT");
        graphFragment.setData(data);

        ListFragment listFragment = (ListFragment) getFragmentManager().findFragmentByTag("LIST_FRAGMENT");
        listFragment.setData(data);

Ho fornito un tag, quindi non sono sicuro perché findFragmentByTag() restituisce null.

Quello che ho provato leggendo altre domande:

  1. this.setRetainInstance(true) in oncreate sia fragments.
  2. Sia fragment costruttori sono vuoti public fragmentName(){}.
  3. provato executePendingTransactions dopo aver aggiunto il fragments.
  4. provato add invece di replace sul fragments (a cura di)

 

6 Replies
  1. 15

    Ho avuto lo stesso problema di findFragmentByTag() restituisce sempre null.

    Alla fine ho rintracciato giù, ero override onSaveInstanceState() nella mia Attività, ma non si chiama super. Non appena ho risolto findFragmentByTag() restituito il Frammento come previsto.

    • Non funziona per me. E non funziona mescolato con @Dmitry Dudá risposta. Non ho usato addToBackStack.
    • non ha aiutato. Io non sovrascriverlo.
  2. 16

    Ero confuso su questo per un lungo periodo di tempo. Primo, è necessario salvare il frammento che si sta sostituendo, premendo sul retro dello stack. Il tag di alimentazione è di mettere sul frammento che si sono aggiunta di, che non si sono spingendo sul retro dello stack. Più tardi, quando si fanno spingere sul retro dello stack, che tag va con esso. Ecco il codice con oggetti suddivisi per rendere più facile da rintracciare. È necessario chiamare ‘addToBackStack’ prima ‘commit’.

    GraphFragment grFrag = new GraphFragment();
    FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
    tr.replace(R.id.fragment_container, grFrag, "GRAPH_FRAGMENT");
    //grFrag is about to become the current fragment, with the tag "GRAPH_FRAGMENT"
    tr.addToBackStack(null);
    //'addToBackStack' also takes a string, which can be null, but this is not the tag
    tr.commit();
    //any previous fragment has now been pushed to the back stack, with it's tag
    
    ListFragment liFrag = new ListFragment();
    FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
    tr.replace(R.id.fragment_container, liFrag, "LIST_FRAGMENT");
    //liFrag is is about to become the current fragment, with the tag "LIST_FRAGMENT"
    tr.addToBackStack(null);
    tr.commit();
    //'grFrag' has now been pushed to the back stack, with it's tag being "GRAPH_FRAGMENT"
    • Grazie. La distinzione tra i tag stringa che viene fornito in sostituzione, e la backstack tag sono due cose diverse. Che è stato attivazione di me per un po
    • Questa è la risposta giusta, come il TAG deve essere aggiunto a sostituire/aggiungere metodi e non addToBackStack(TAG) metodo non ha nulla a che fare con findFragmentByTag(TAG).
    • Bella spiegazione. Mi ha salvato amico
  3. 7

    È possibile utilizzare

    fragmentTransaction.addToBackStack(yourFragmentTag);

    Dopo di che si può riutilizzare con

    getSupportFragmentManager().findFragmentByTag(yourFragmentTag);
    • getSupportFragmentManager() non risolvere il problema per egli non si estende da android.support.v4.app.Fragment in due frammenti
    • e non c’è bisogno di aggiungere il suo frammenti di back stack troppo
    • certo. era una risposta rapida. se egli non utilizza la libreria di supporto può utilizzare getFragmentManager(); e egli possibile aggiungere tutti i frammenti che si desidera riutilizzare e trovare e riutilizzare in seguito.
    • addtoBackStack era quello che mi mancava 😛
    • Anche io ho avuto lo stesso problema, ho usato addToBackStack(TAG), ma il problema era in add(contenitore, frammento). Ho cambiato aggiungere(contenitore, frammento, TAG) e il problema è andato via
  4. 6

    Chiamata getFragmentManager().executePendingTransactions() dopo frammento di transazione.

    getFragmentManager()
        .beginTransaction()
        .replace(R.id.container, new ExampleFragment(), "YOUR TAG HERE");
        .commit();
    
    //after transaction you must call the executePendingTransaction
    getFragmentManager().executePendingTransactions();
    
    //now you can get fragment which is added with tag
    ExampleFragment exampleFragment = getFragmentManager().findFragmentByTag("YOUR TAG HERE");
    • Si dovrebbe aggiungere un po ‘ di spiegazioni / informazioni di base per la vostra risposta per renderlo più prezioso. (e mettere getSupport... in gli apici inversi `)
    • ho modificato il mio codice.
    • Grazie, questo ha risolto il mio problema.
    • Non mi aiuta con androidX
  5. 0

    Nel mio caso ho dovuto creare un livello di classe FragmentManager oggetto e poi usarlo invece di utilizzare getSupportFragmentManager() direttamente.

    public class Main extends BaseActivity {
       FragmentManager fragmentManager;
    
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragmain);
        fragmentManager = getSupportFragmentManager();
        initFrag1();
      }
    
      private void initFrag1() {
        String name = Frag1.class.getSimpleName();
        if (fragmentManager.findFragmentByTag(name) == null) {
          fragmentManager.beginTransaction()
              .add(R.id.frag_container, new Frag1(), name)
              .addToBackStack(name)
              .commit();
        }
      }
    }

Lascia un commento