迭代后端堆栈上的碎片

时间:2013-12-08 09:18:13

标签: android android-fragments back-stack

我发现了一些类似的问题,但我没有找到任何符合我具体案例的答案

迭代backstack上的所有片段的正确方法是什么,以便对每个片段执行特定操作?我需要根据环境的变化更新一些并删除一些片段(理论上,我可以在片段再次获得焦点时捕获事件然后采取适当的操作,但这会使事情变得复杂,因为我'我还处理重命名的事情)

鉴于片段的容器如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/fragment_container"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent" />

并添加片段如下:

FragmentTransaction transaction = context.getSupportFragmentManager().beginTransaction();
Fragment fragment = new CustomFragment();

transaction.add(R.id.fragment_container, fragmentBase);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack(nameOfFragment);

transaction.commit();

context.getSupportFragmentManager().executePendingTransactions();

我的第一次迭代尝试是:

getSupportFragmentManager().executePendingTransactions();
for (int indexFragment = 0; indexFragment < getSupportFragmentManager().getBackStackEntryCount(); indexFragment++)
{
    FragmentManager.BackStackEntry backStackEntry = getSupportFragmentManager().getBackStackEntryAt(indexFragment);                    

    // If Android keeps the ID, surely there should be a way of getting to the actual fragment itself, from that ID?
    Fragment fragment = getSupportFragmentManager().findFragmentById(backStackEntry.getId());                   

    if (fragment != null)
    {               
        //TODO: Cast the fragment and perform some transactions against it

        // We never get here; as fragment is always null
    }
}

从不同的角度来看:

FrameLayout frameLayout = (FrameLayout)findViewById(R.id.fragment_container);

for (int indexFrameLayout = 0; indexFrameLayout < frameLayout.getChildCount(); indexFrameLayout++)
{
    View view = (View)frameLayout.getChildAt(indexFrameLayout);

    // I get the right number of views; but I can't interact with them as fragments
}

我可以假设通过保留对片段的引用来破解我的方式,但是这种方法存在问题。

  • 有没有办法让我可以找到目前在后台堆上的碎片?

  • 考虑到我可以获得片段的假设,有没有办法从backstack中的某个地方删除它(并且只有它?) (有一个transaction.remove方法,但是它是用于处理位于后端堆栈中间的片段吗?)

由于

1 个答案:

答案 0 :(得分:1)

BackStackEntry没有必要与单个Fragment相关联,它代表FragmentManager状态,您可能在事务中有一堆片段,因此在一个状态中有一堆片段。使用add() getSupportFragmentManager().findFragmentById(fragment_tag);方法,并通过标记为您的片段指定唯一ID。然后,您就可以通过BackStack

找到它们

至于你的任务,afaik没有办法从onBackPressed()删除一个任意状态,你唯一的选择是弹出堆栈从顶部移除一个状态。例如,您可以覆盖fragmentManager.popBackStack()并致电fragmentManager.popBackStack(backstack_tag),只需转到上一个状态,或{{1}}跳过某些状态,然后转到您需要的位置。