使用包含选项卡的片段处理backstack

时间:2015-06-02 11:50:13

标签: android android-fragments back-stack fragmenttransaction fragment-backstack

我正在尝试创建一个Android应用程序,其中包含一个带有容器和导航抽屉的活动。初始化的空容器加载片段,片段布局中有一个ViewPager,我在其中加载了一个带有FragmentTransaction的片段:

public static void replaceFragmentInContainer(FragmentManager fragmentManager, Fragment fragmentToShow,
        boolean addToBackStack)
{
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (addToBackStack)
    {
        transaction.addToBackStack(null);
    }
    transaction.replace(R.id.container, fragmentToShow);
    transaction.commit();
}

我在v7 ActionBar中使用带有v7 ActionBarActivity的v4片段。

每个加载的片段都是一个片段,它只加载带有其他片段的制表符,它们具有实际的可用性。此类标签加载片段的示例:

public class MainFragment extends TabsFragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        super.onCreateView(inflater, container, savedInstanceState);
        View contentView = inflater.inflate(R.layout.fragment_main, container, false);
        initTabsLayout(savedInstanceState, contentView, R.id.pager);
        addTab("tabspectag1", "", R.drawable.draw1, Fragment1.class, null);
        addTab("tabspectag2", "", R.drawable.draw2, Fragment2.class, null);
        addTab("tabspectag3", "", R.drawable.draw3, Fragment3.class, null);
        return contentView;
    }

我面临的问题是靠背。当一个片段被添加到backstack并且我按下后退按钮时,应用程序会像我想要的那样返回到上一个片段,并且我看到了标签布局本身,但是标签的内容是空的,就像没有任何内容加载到那个标签。当它发生时,我只能在使用导航抽屉再次选择该屏幕时重新加载标签的内容。

我已尝试覆盖活动中的onBackPressed

@Override
public void onBackPressed()
{
    if (getFragmentManager().getBackStackEntryCount() > 0)
    {
        getFragmentManager().popBackStack();
    } else
    {
        super.onBackPressed();
    }
}

但就像我说的那样,就像我回到之前的片段,但片段里面的标签没有重新绘制它所拥有的片段。

可以采取哪些措施来解决这个问题?

因为我看到backstack中原始片段的标签布局而不是标签内的片段,是否有可能我只需要以某种方式刷新标签内容意味着重新绘制它?如果我可以做这样的事情,那我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

您没有发布整个代码,但请记住,在片段内使用片段时,外部片段应使用childfragmentmanager而不是常规片段管理器。

如果您有一个Activity,那么您有一个具有Viewpager的片段,并且在该viewpager中,视图是片段,那些外部片段必须使用他们自己的子片段管理器而不是活动片段管理器。

Activity使用getFragmentManager()实例化并显示新片段。片段使用getChildFragmentManager()来实例化并显示新的内部片段。 (片段内的片段)。

如果您始终使用相同的fragmentmanager来处理事务,则行为将是不可预测的。

您的Viewpager应该有一个TabsAdapter关联,它从FragmentStatePagerAdapter扩展到显示新的片段(并使用片段中的getChildFragmentManager而不是活动)。