0

我正在尝试创建一个 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();
}

我在 v7ActionBar中使用 v4 片段和 v7 ActionBarActivity

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

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。当一个片段被添加到 backstack 并且我按下后退按钮时,应用程序确实像我想要的那样返回到上一个片段,我看到了选项卡布局本身,但是选项卡的内容是空的,就像没有加载任何内容一样那个标签。发生这种情况时,我仅在使用导航抽屉再次选择该屏幕时才设法重新加载选项卡的内容。

我试过覆盖onBackPressed活动中的:

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

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

可以做些什么来解决这个问题?

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

4

1 回答 1

2

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

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

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

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

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

于 2015-06-02T13:22:04.550 回答