我有一个工作应用程序,我正在尝试通过根据 Android 文档填充不同的布局来优化在平板电脑上的使用。
我遇到的问题是,当处于纵向时,我的视图由 ViewPager 填充,而我的两个重要片段及其适配器中的数据。当处于横向时,视图由相同的两个片段填充,但并排在一个布局中而不是在 ViewPager 中。我将片段保存在 onSaveInstanceState 中,然后像这样再次检索它们:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mSummaryFragment != null) {
getFragmentManager().putFragment(outState, TAG_SUMMARY, mSummaryFragment);
}
if (mDetailsFragment != null) {
getFragmentManager().putFragment(outState, TAG_DETAILS, mDetailsFragment);
}
}
在 onCreate 中检索...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mSummaryFragment = (SummaryFragment) getFragmentManager().getFragment(savedInstanceState, TAG_SUMMARY);
mDetailsFragment = (DetailsFragment) getFragmentManager().getFragment(savedInstanceState, TAG_DETAILS);
} else {
mSummaryFragment = new SummaryFragment();
mDetailsFragment = new DetailsFragment();
}
}
我应该提到这些片段是嵌套的,因为我的主要活动实际上是片段本身。从 4.2 开始,我相信这应该不是问题,但我对生命周期并不是 100% 精通。我的视图填充如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
View result = inflater.inflate(R.layout.main, container, false);
ViewPager pager = (ViewPager) result.findViewById(R.id.viewpager);
if (null != pager) {
pager.setAdapter(new PagerAdapter(getFragmentManager(), mUpdater));
} else {
FragmentManager fm = getFragmentManager();
fm.beginTransaction().add(R.id.summary_container, mSummaryFragment).commit();
fm.beginTransaction().add(R.id.details_container, mDetailsFragment).commit();
}
if (savedInstanceState == null) {
Refresh(0,0);
}
return (result);
}
PagerAdapter 的 getItem 方法如下所示:
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return mSummaryFragment;
case 1:
return mDetailsFragment;
}
return null;
}
首次启动时一切正常,但是当方向改变时,无论方向改变哪种方式(纵向 -> 横向或反之亦然),我都会在 logcat 中收到此错误:
java.lang.IllegalStateException:无法更改片段的容器 ID SummaryFragment{40dd1800 #1 id=0x7f0b004a android:switcher:2131427400:0}:是 2131427402 现在是 2131427400
我不完全确定这是做我想做的最好的方法 - 但是将片段保存到一个包中并检索它们是我在 Google IO 2013 源代码中发现的一个技巧,所以我希望它至少部分正确。