我的应用程序的布局因方向和设备大小而异。在较大的设备上,它由同时可见的两个视图组成。在较小的设备上,布局是允许用户在两个窗格之间切换的 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);
}
}