Android 如何获取片段的所有子片段/内部片段/嵌套片段?

Android 如何获取片段的所有子片段/内部片段/嵌套片段?,android,android-fragments,android-nested-fragment,Android,Android Fragments,Android Nested Fragment,它看起来像是一个。但是我怎样才能得到给定片段的所有子片段呢 这个问题也与有关,你可以用同样的方法来做——只需使用片段实例的getChildFragmentManager()而不是活动片段管理器获得的FragmentManager。当然,这假设您正在使用重新编译的支持库版本,并且getFragments()未隐藏,或者正在使用反射来获取并调用该方法 以下解决方案并不完美,但在某种程度上是可行的: 如果androidsdk是17+,那么它可以正常工作 在SDK 17之下,它适用于根级别的片段(直接

它看起来像是一个。但是我怎样才能得到给定片段的所有子片段呢


这个问题也与

有关,你可以用同样的方法来做——只需使用
片段
实例的
getChildFragmentManager()
而不是
活动
片段管理器
获得的
FragmentManager
。当然,这假设您正在使用重新编译的支持库版本,并且
getFragments()
未隐藏,或者正在使用反射来获取并调用该方法

以下解决方案并不完美,但在某种程度上是可行的:

  • 如果androidsdk是17+,那么它可以正常工作
  • 在SDK 17之下,它适用于根级别的片段(直接添加到活动),也适用于级别1的片段(添加到根级别的片段)
  • 对于级别>=2的片段,它将始终返回根级别的片段。这意味着不可能返回级别>=2的片段的真实父级,它将始终在根级别返回其祖先
  • 不幸的是,这意味着您必须拥有对activity类的访问权限,因此此解决方案不是真正的通用解决方案
这是解决办法。下面给出了MyActivity类

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;
}
public静态片段getParentFragment(片段片段片段){
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.JELLY\u BEAN)
返回fragment.getParentFragment();
MyActivity=(MyActivity)fragment.getActivity();
List fragmentList=activity.getActiveFragments();
if(fragmentList.contains(fragment)){
返回null;
}
对于(片段片段级别1:片段列表){
如果(fragmentLevel1.getFragmentManager()==fragment.getFragmentManager()){
返回碎片级别1;
}
}
//这是不应该发生的,最好抛出一个异常
返回null;
}
其中MyActivity基于:

公共类MyActivity{
List fragList=new ArrayList();
@凌驾
公共碎片(碎片碎片){
添加(新的WeakReference(片段));
}
公共列表getActiveFragments(){
ArrayList ret=新的ArrayList();
对于(WeakReference ref:fragList){
片段f=ref.get();
如果(f!=null){
如果(f.isVisible()){
再加上(f);
}
}
}
返回ret;
}
}

与什么相同?此外,我正在寻找一些始终有效的方法,它不是针对某个应用程序,而是针对适用于所有应用程序的库。与您链接的答案相同(使用getFragments())。我不相信有任何其他方法可以做到这一点。看起来getFragments在SupportFragmentManager上公开了,即使javadoc没有这样说。是的,对于本机片段管理器来说,使用反射是必须的,但这并不能解决我使用本机(不支持)片段的情况。
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;
    }
}