【问题标题】:How to get all sub/inner/nested Fragments of a Fragment?如何获取片段的所有子/内部/嵌套片段?
【发布时间】:2014-06-19 20:19:10
【问题描述】:

它看起来像是possible to get all fragments of an Activity pretty easily。但是如何获取给定片段的所有子片段?

这个问题也和getParentFragment API 16有关

【问题讨论】:

    标签: android android-fragments android-nested-fragment


    【解决方案1】:

    你可以用同样的方法来做——只需使用通过Fragment实例的getChildFragmentManager()而不是ActivityFragmentManager获得的FragmentManager。当然,这假设您使用的是支持库的重新编译版本,其中 getFragments() 未隐藏,或者正在使用反射来调用该方法。

    【讨论】:

    • 和什么一样?此外,我正在寻找一些始终有效的方法,它不是针对应用程序,而是针对应该适用于所有应用程序的库。
    • 与您链接到的答案相同(使用 getFragments())。我认为没有其他方法可以做到这一点。
    • 看起来 getFragments 在支持片段管理器上公开了,即使 javadoc 没有这么说。是的,原生片段管理器必须使用反射。
    • 但这并没有解决我使用本机(不支持)片段的情况。
    【解决方案2】:

    以下解决方案并不完美,但在一定程度上可行:

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

    这里是解决方案。 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;
    }
    

    MyActivity 基于的位置: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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多