我有两个使用 ViewPager 的活动,第一个使用几个 ListViews 管理 Fragments,第二个里面有 ListView 和 WebView。活动中的两个 onCreate 方法看起来都一样(唯一的区别是寻呼机类):
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_subcat_list);
mPager = new SubcatListPager(this);
mPager.initialisePaging(false);
}
当我更改屏幕方向时会出现问题。带有 ListView 片段的 Activity 可以正常工作,但是在执行此行时,第二个 Activity 会创建带有 WebView 的片段super.onCreate(savedInstanceState);
。然后在寻呼机代码中再次创建该片段。我在调试器中对其进行了跟踪,每次方向更改都会创建两个带有 webview 的片段。我通过传递 null 而不是 saved instance: 解决了这个问题super.onCreate(null);
,但我认为这不是正确的方法。
有没有更好的方法来解决这个问题并恢复我在 ViewPager 中创建的片段的状态?我可以使用 savedInstanceState 并将其传递给我在寻呼机中创建的片段,但我不确定将 null 传递给活动的父项是否正确。
UPD:ManosProm 的解决方案解决了片段重新创建问题,但现在这些片段中的 getActivity 返回 null。快速搜索告诉它可能是由于片段与活动分离造成的。这是我的代码:
public CommentsPager(SherlockFragmentActivity fa, Class<? extends SherlockFragment> fragment)
{
mFragmentActivity = fa;
try {
FragmentManager fm = mFragmentActivity.getSupportFragmentManager();
mContentFragment = (SherlockFragment) fm.findFragmentByTag(makeFragmentTag(0));
if (mContentFragment == null)
mContentFragment = fragment.newInstance();
mCommentsFragment = (CommentsListFragment) fm.findFragmentByTag(makeFragmentTag(1));
if (mCommentsFragment == null)
mCommentsFragment = CommentsListFragment.class.newInstance();
}
catch (Exception e) {
e.printStackTrace();
Toast.makeText(fa, "Pager creation failed: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void initialisePaging(boolean bInLayout) {
//mFragmentActivity.setTitle(mFragmentActivity.getResources().getString(SiteContent.curr_cat.nameID));
try {
List<Fragment> fragments = new Vector<Fragment>();
mSectionsPagerAdapter = new CommentsPagerAdapter(mFragmentActivity.getSupportFragmentManager(), fragments);
if (!(mContentFragment instanceof ContentDownloader)) {
throw new IllegalStateException(
"Fragment must implement content downloader interface.");
}
fragments.add(mContentFragment);
fragments.add(mCommentsFragment);
mViewPager = (ViewPager)mFragmentActivity.findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
final ActionBar actionBar = mFragmentActivity.getSupportActionBar();
actionBar.removeAllTabs();
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
Tab tab = actionBar.newTab();
tab.setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this);
actionBar.addTab(tab, i == 0);
}
//actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayHomeAsUpEnabled(!bInLayout);
}
catch (Exception e)
{
e.printStackTrace();
}
}
如何将片段重新附加到活动?或者代码很好,我应该在其他地方寻找问题?