2014-06-19 5 views

Antwort

1

Sie können es auf die gleiche Art und Weise tun - verwenden Sie einfach die FragmentManager unter Verwendung der Fragment Instanz getChildFragmentManager() anstelle des ActivityFragmentManager. Dies setzt natürlich voraus, dass Sie eine neu kompilierte Version der Support-Bibliothek mit getFragments() nicht ausgeblendet verwenden oder Reflektion verwenden, um diese Methode aufzurufen.

+0

gleiche Art und Weise wie das, was? Außerdem suche ich nach einer Methode, die immer funktioniert, es ist nicht für eine App, sondern für eine Bibliothek, die für alle Apps funktionieren sollte. – Snicolas

+0

Wie die Antwort, mit der Sie verknüpft haben (mit getFragments()). Ich glaube nicht, dass es anders geht. – kcoppock

+0

Es sieht so aus, als ob getFragments auf dem Support Fragment Manager veröffentlicht wurde, auch wenn Javadoc das nicht sagt. Und ja, die Verwendung von Reflektion ist für den nativen Fragmentmanager obligatorisch. – Snicolas

0

Die folgende Lösung ist nicht perfekt, aber es funktioniert in gewissem Maße:

  • Wenn Android SDK 17+ ist, dann funktioniert es gut
  • unter SDK 17 für Fragmente auf Root-Ebene arbeitet (hinzugefügt direkt zur Aktivität), und funktioniert auch für Fragmente der Ebene 1 (hinzugefügt zu einem Fragment auf der Stammebene).
  • für Fragmente der Ebene> = 2, dann wird immer ein Fragment der Root-Ebene zurückgegeben. Es bedeutet, dass es nicht möglich ist, das echte Elternteil eines Fragments zurückzugeben, dessen Level> = 2 ist, es wird immer seinen Vorgänger auf der Root-Ebene zurückgeben.
  • Und leider bedeutet es, dass Sie Zugriff auf die Aktivitätsklasse haben müssen, also ist diese Lösung nicht wirklich generisch.

Hier ist die Lösung. Die MyActivity-Klasse ist unten angegeben.

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

Wo MyActivity basiert auf: 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; 
    } 
} 
Verwandte Themen