我还没有找到一种简单的方法来获取活动中所有当前活动的(可见,当前处于恢复状态)碎片。我的活动中是否可以不使用自定义簿记?似乎FragmentManager不支持此功能。
答案 0 :(得分:109)
看起来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来设置一个标志(可能只是一个bool字段)。
这已经是一些自己的簿记,但考虑到你想要实现的非常具体的目标(状态依赖列表),我认为仍然非常有限。
答案 1 :(得分:13)
如果您使用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;
}
答案 2 :(得分:2)
另一种方法是在将片段添加到活动时将标记放在片段上。
例如,如果您动态添加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));
}
答案 3 :(得分:1)
我解决了这个问题:
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;
}
答案 4 :(得分:1)
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();
常规android.app.FragmentManager
根本没有此方法,但如果确实需要,您可以通过反射获取字段mActive
来访问同一个对象(请注意:从API 26开始) ,其类型为SparseArray
,而不是List
)。使用风险自负:)
答案 5 :(得分:1)
这是Kotlin中的递归解决方案。给定活动的最上面的片段,返回所有后代片段。
fun recursiveGetFragments(parents: List<Fragment>): List<Fragment> {
val result = parents.toMutableList()
for(root in parents) {
if (root.isVisible) {
result.addAll(recursiveGetFragments(root.childFragmentManager.fragments))
}
}
return result
}
它用作:
val fragmentList = recursiveGetFragments(supportFragmentManager.fragments)
答案 6 :(得分:0)
我们可以使用一些不规则但合法的方法
ArrayList<Fragment> getActiveFragments() {
Fragment f;
final ArrayList<Fragment> fragments = new ArrayList<>();
int i = 0;
try {
while ((f = getFragmentManager().getFragment(new Intent().putExtra("anyvalue", i++).getExtras(), "anyvalue")) != null) {
fragments.add(f);
}
} catch (IllegalStateException ex) {
}
return fragments;
}