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;
}
}
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
Uguale alla risposta a cui si è collegati (utilizzando getFragments()). Non credo che ci sia un altro modo per farlo. – kcoppock
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