1

我的应用程序的布局因方向和设备大小而异。在较大的设备上,它由同时可见的两个视图组成。在较小的设备上,布局是允许用户在两​​个窗格之间切换的 ViewPager。这是一个典型的模式。

问题是 ViewPager 似乎停留在周围,并保留了它的片段。但是,TextRenderFragment 不会保留相同的片段实例。相反,似乎每次都重新创建该类。由于片段保存在 ViewPager 中,我最终得到了两组内容视图。这会导致恢复状态出现问题,因为两组视图不共享一个 Bundle。

鉴于这是一种常见的模式,我希望找到关于如何正确执行此操作的讨论,但一直无法。我想让 ViewPager 放弃它的片段,或者找到一种方法在 ViewPager 和静态布局中使用相同的内容片段实例,具体取决于方向。

结构如下所示:

@Override
public View onCreateView(final LayoutInflater inflater,
        final ViewGroup container, final Bundle saved_instance_state) {

    if (saved_instance_state != null) {
        current_book = saved_instance_state.getInt("book");
        current_chapter = saved_instance_state.getInt("chapter");
    }

    // Inflate the layout for this fragment
    final View v = inflater.inflate(R.layout.fragment_text_render,
            container, false);

    _configure_content_fragments(v);
    return v;
}

private void _configure_content_fragments(final View v) {
    final ViewPager vp = (ViewPager) v.findViewById(R.id.tr_view_pager);
    bl = new DocLoader();

    boolean add_fragments = false;
    final FragmentManager mgr = getFragmentManager();
    primary_content_fragment = (PrimaryContent) mgr
            .findFragmentByTag("primary_content_fragment");
    secondary_content_fragment = (SecondaryContent) mgr
            .findFragmentByTag("secondary_content_fragment");

    if (primary_content_fragment == null) {
        primary_content_fragment = new PrimaryContent();
        secondary_content_fragment = new SecondaryContent();
        primary_content_fragment.setNavLocation(current_book,
                current_chapter);
        add_fragments = true;
    }

    if (add_fragments && vp == null) {
        final android.support.v4.app.FragmentTransaction tx = getFragmentManager()
                .beginTransaction();
        tx.add(R.id.tr_primary_content_container, primary_content_fragment,
                "primary_content_fragment");
        tx.add(R.id.tr_secondary_content_container,
                secondary_content_fragment, "secondary_content_fragment");
        tx.commit();
    }

}

ViewPager 的初始化如下所示:

@Override
public void onStart() {
    super.onStart();
    _configure_view_pager(getView());
}
 private void _configure_view_pager(final View v) {
    final ViewPager vp = (ViewPager) v.findViewById(R.id.tr_view_pager);

    if (vp != null) {
        final FragmentManager mgr = getFragmentManager();
        final FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(
                mgr) {

            @Override
            public int getCount() {
                return 2;
            }

            @Override
            public Fragment getItem(final int item) {
                switch (item) {
                case 0:
                    return primary_content_fragment;
                case 1:
                    return secondary_content_fragment;
                }

                return null;
            }
        };

        vp.setAdapter(adapter);
    }
}
4

1 回答 1

0

在这个问题上花了很多时间之后,在这里没有收到任何答案,似乎没有简单的方法可以做到这一点。您可以询问父级的 FragmentManager 并以这种方式手动处理事情,但我认为像这样的事情做这样的事情是解决一般问题的错误方法。

我们改变了使用 DrawerLayout 的方法。这解决了我遇到的所有问题,并提供了一个不错的 UI。

于 2013-08-07T17:38:36.533 回答