【问题标题】:How can I return this fragment?我怎样才能返回这个片段?
【发布时间】:2016-07-14 20:33:50
【问题描述】:
我有一个(预先编写的)片段,以R.layout.myFragment 访问。由于我必须将 Fragment(也在预先编写的代码中)传递给 ViewPager 内的 FragmentPagerAdapter,因此我尝试将其作为 getFragmentManager().findFragmentById(R.layout.myFragment) 传递,但它返回 null,可能因为它期望 R.id.something 形式的东西.
我在这里找到了一些答案 - 与实现谷歌地图片段相关 - 但那些(我认为)不适用于我的问题,因为我必须使用 R.layout.myFragment 形式的片段并且没有父/容器片段(或据我所知,类似的东西)使用 FragmentTransaction。
Fragment 预计将在 ViewPager 的 FragmentPagerAdapter 的 getItem() 覆盖中返回。我怎样才能让那个 Fragment 传递它来返回它?
【问题讨论】:
标签:
android
android-fragments
【解决方案1】:
有两种可能的解决方案。两者都涉及遍历所有片段以找到您需要的片段。
正如didi_X8 所解释的here,您可以使用Activity 类的onAttachFragment 方法来创建所有附加片段的列表,然后对它们进行迭代:
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;
}
另一个解决方案as explained by Michael 是使用支持库并利用 getFragments 方法:
public List<Fragment> getVisibleFragments() {
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
if (allFragments == null || allFragments.isEmpty()) {
return Collections.emptyList();
}
List<Fragment> visibleFragments = new ArrayList<Fragment>();
for (Fragment fragment : allFragments) {
if (fragment.isVisible()) {
visibleFragments.add(fragment);
}
}
return visibleFragments;
}