有没有办法获取活动中所有当前活动片段的引用?
我还没有find一个简单的方法来获取活动中当前所有活动(可见,当前处于恢复状态)碎片。 没有自定义簿记在我的活动吗? 看来FragmentManager不支持这个function。
看起来像API目前错过了像“getFragments”的方法。
然而,使用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; }
如果没有现成的方法来读取对象的状态(例如isActive()),我会覆盖onResume和onPause设置一个标志(可能只是一个布尔字段)。
这已经是一些自己的记账了,但考虑到你想实现的具体目标(状态依赖列表),我认为还是非常有限。
如果您使用Android支持库,那么您可以调用隐藏的FragmentManager.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; }
另一种方法是将标签添加到活动时将标签放在碎片上。
例如,如果您dynamic添加4个片段,则可以将它们添加为:
for (int i = 0; i < NUM_FRAGMENTS; i++){ MyFragment fragment = new Fragment(i); fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit() }
那么,如果你需要在以后把所有的片段都回来,你可以这样做:
for (int i = 0; i < NUM_FRAGMENTS; i++) { String tag = SOME_CUSTOM_PREFIX + i; fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag)); }
我解决了这个问题:
public ArrayList<Fragment> getAllFragments() { ArrayList<Fragment> lista = new ArrayList<Fragment>(); for (Fragment fragment : getSupportFragmentManager().getFragments()) { try { fragment.getTag(); lista.add(fragment); } catch (NullPointerException e) { } } return lista; }
android.support.v4.app.FragmentManager
有一个名为getFragments()
的方法,它正是你所需要的,但是它永远不可访问。 突然,虽然,但是,我不确定这是否意图,因为它仍然被标记为隐藏。
/** * Get a list of all fragments that have been added to the fragment manager. * * @return The list of all fragments or null if none. * @hide */ public abstract List<Fragment> getFragments();
常规的FragmentManager
根本没有这个方法,但是如果确实需要的话,可以通过reflection来获得相同的对象。 自担风险:)