我有一个问题,似乎无法解决。在我的一个活动(即MainActivity)中,我有一个ViewPager。 我正在实现所有必需的方法来保存和检索实例状态,以便在后台杀死该活动时使用。但当活动尝试恢复其状态时,片段被恢复,但它们未附加到viewpager上,因此我得到的只是白屏。
以下是相关代码:
MainActivity.java
以下是相关代码:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//..
if (savedInstanceState==null) {
setupViewPager();
}
}
private void setupViewPager() {
mAdapter = new ViewPagerAdapter(getSupportFragmentManager());
mAdapter.addFrag(FirstFragment.newInstance(mFeedItem), "INFO");
//Note: mFeedItem is obtained from the intent and I have verified
// that it is properly restored.
mAdapter.addFrag(SecondFragment.newInstance(mFeedItem), "SERVICES");
mViewPager.setAdapter(mAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
FirstFragment.java
public static FirstFragment newInstance(Workshop item) {
FirstFragment f = new FirstFragment();
f.mItem = item;
return f;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("feed_item",Workshop.packToGson(mItem));
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_item_detail_info, container, false);
if (savedInstanceState!=null) {
mItem = Workshop.extractGson(savedInstanceState.getString("feed_item"));
}
return v;
}
如果我导航到另一个活动,然后在后台杀死MainActivity
(我使用不保留活动设置来测试这个问题),会发生以下情况:
1) 活动被正确恢复,没有任何问题。
2) 片段的onCreateView
被调用,并且包含savedInstanceState
。
3) 然而,在我的活动中,ViewPager和Adapter为空。片段似乎没有重新附加到适配器/ViewPager上。
那么我错过了什么?我需要做什么才能正确地恢复这些片段吗?
PS:
我可以快速解决这个问题,只需在我的MainActivity
中进行以下替换:
if (savedInstanceState==null) {
setupViewPager();
}
只需使用 setupViewPager();
,无论是恢复还是首次启动,都将创建新的适配器和片段。 但这带来了重置片段状态的缺点。 另外,当我这样做时,我发现每个片段都有两个实例,一个是恢复的,一个是新的,只有新实例才会显示。 因此,我不认为这是最佳方法。
Fragment
一开始并没有被实例化/保存。然后您需要使用if-branch
来实例化一个新的。 - Murat KaragözFragmentStatePagerAdapter
不起作用。我将其更改为FragmentPagerAdapter
,一切都很好。 - ShahiM