【发布时间】:2018-04-16 22:28:47
【问题描述】:
所以我有一个我似乎无法解决的问题。我的一项活动中有一个 ViewPager,比如 MainActivity。当活动在后台被杀死时,我正在实现所有必需的方法来保存和检索实例状态。但是当 Activity 尝试恢复其状态时,片段会被恢复,但它们没有附加到 viewpager,所以我得到的只是一个白屏。
这里是相关代码:
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 在后台被杀死(我正在使用 Don’t Keep Activities 设置来测试这一点),就会发生这种情况:
1) Activity 已正确恢复,没有问题。
2)片段的onCreateView被调用,savedInstanceState完好无损。
3) 但是,我的 Activity 中的 ViewPager 和 Adapter 是 null。片段似乎没有连接回适配器/viewpager。
那么我在这里错过了什么?我应该做些什么来正确恢复碎片吗?
PS:
我可以通过在我的MainActivity 中替换它来快速解决问题:
if (savedInstanceState==null) {
setupViewPager();
}
只使用setupViewPager();,以便创建新的适配器和片段,无论它是第一次恢复还是启动。但这带来了重置片段状态的缺点。另外,当我这样做时,我发现每个片段有两个实例,一个是恢复的,一个是新的,实际上只显示了新的实例。所以我不认为这是最好的方法。
【问题讨论】:
标签: java android performance android-fragments android-viewpager