2014-06-19 15 views

risposta

1

Si può fare nello stesso modo - basta usare il FragmentManager ottenuto utilizzando il dell'istanza FragmentgetChildFragmentManager() al posto del ActivityFragmentManager. Naturalmente, si presume che si stia utilizzando una versione ricompilata della libreria di supporto con getFragments() non nascosta oppure si usi la reflection per ottenere il richiamo di quel metodo.

+0

stesso modo di che cosa? Inoltre, sto cercando un metodo che funzioni sempre, non per un'app ma per una libreria che dovrebbe funzionare per tutte le app. – Snicolas

+0

Uguale alla risposta a cui si è collegati (utilizzando getFragments()). Non credo che ci sia un altro modo per farlo. – kcoppock

+0

Sembra che getFragments sia diventato pubblico sul gestore dei frammenti di supporto, anche se javadoc non lo dice. E sì, l'uso della riflessione è obbligatorio per il gestore dei frammenti nativi. – Snicolas

0

La seguente soluzione non è perfetta ma funziona in qualche misura:

  • Se Android SDK è 17+, allora funziona bene
  • sotto SDK 17 funziona per frammenti al livello principale (aggiunto direttamente all'attività), e funziona bene anche per frammenti di livello 1 (aggiunti a un frammento a livello di root).
  • per frammenti di livello> = 2, quindi restituirà sempre un frammento di livello radice. Significa che non è possibile restituire il vero genitore di un frammento il cui livello è> = 2, restituirà sempre il suo antenato a livello di root.
  • E, sfortunatamente, significa che è necessario avere accesso alla classe di attività, quindi questa soluzione non è veramente generica.

Ecco la soluzione. La classe MyActivity è riportata di seguito.

public static Fragment getParentFragment(Fragment fragment) { 
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) 
     return fragment.getParentFragment(); 
    MyActivity activity = (MyActivity)fragment.getActivity(); 
    List<Fragment> fragmentList = activity.getActiveFragments(); 
    if(fragmentList.contains(fragment)) { 
     return null; 
    } 
    for(Fragment fragmentLevel1 : fragmentList) { 
     if(fragmentLevel1.getFragmentManager() == fragment.getFragmentManager()) { 
      return fragmentLevel1; 
     } 
    } 
    //this is not supposed to happen, it might be better to throw an exception 
    return null; 
} 

Dove MyActivity si basa su: Is there a way to get references for all currently active fragments in an Activity?

public class MyActivity { 
    List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>(); 

    @Override 
    public void onAttachFragment (Fragment fragment) { 
     fragList.add(new WeakReference(fragment)); 
    } 

    public List<Fragment> getActiveFragments() { 
     ArrayList<Fragment> ret = new ArrayList<Fragment>(); 
     for(WeakReference<Fragment> ref : fragList) { 
      Fragment f = ref.get(); 
      if(f != null) { 
       if(f.isVisible()) { 
        ret.add(f); 
       } 
      } 
     } 
     return ret; 
    } 
}