【问题标题】:Handling the backstack with fragments containing tabs使用包含选项卡的片段处理后台堆栈
【发布时间】:2015-06-02 11:50:12
【问题描述】:

我正在尝试创建一个 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 ActionBarActivity 中使用 v4 片段和 v7 ActionBar

每个加载的片段都是一个片段,它只加载具有实际可用性的其他片段的选项卡。此类标签加载片段的示例:

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();
    }
}

但就像我说的那样,就像我要回到上一个片段,但该片段内的选项卡并没有重新绘制它拥有的片段。

有什么办法可以解决这个问题?

由于我确实看到了后台堆栈中原始片段的标签布局,但没有看到标签内的片段,我是否可能只需要以某种方式刷新标签内容意味着重新绘制它?如果我能做这样的事情,那我该怎么做呢?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果您总是使用同一个片段管理器来处理事务,那么行为将是不可预测的。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2022-12-11
    相关资源
    最近更新 更多