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类的访问权限,因此此解决方案不是真正的通用解决方案
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;
}
}