ViewPager 片段重新创建,已恢复但不可见
Posted
技术标签:
【中文标题】ViewPager 片段重新创建,已恢复但不可见【英文标题】:ViewPager fragments recreation, are resumed but not visible 【发布时间】:2013-05-08 09:59:17 【问题描述】:我遇到了 ViewPager + FragmentPageAdapter 的问题。
场景: 我在 Fragment A 中有一个 Activity。 片段 A 有一个带有片段 B1 和片段 B2 的 ViewPager。 B1 e B2 是同一个类,但作为参数的数据不同。
问题: 一切都在创建时运行良好。但是当应用程序进入后台并且进程被android杀死时,试图恢复上一个状态,再次启动应用程序时,Fragment B1 e B2 在前台不可见,而 Fragment A 是。 似乎有点奇怪的是 Fragment B1 e B2 在 Fragment A 的 ChildFragmentManager 中,并且由于 onStart() 和 onResume() 被调用(由 Log 看到)而被恢复。此外,寻呼机恢复了两页,但为空或更好,没有可见的内容。
如果我理解 FragmentPagerAdapter 的工作原理,它应该负责管理自己的片段以及如何重新创建它们。此外,为了强制执行这一点,FragmentPagerAdapter 在从后台返回时不会调用 getItem(int position) 如果在该位置已经存在具有指定标记的片段。
...那为什么我看不到 Fragment B1 e B2,而只是 Pager 是空的?
这是我的示例代码。
片段A
@Override
public void onStart()
super.onStart();
populateViewPager();
private void populateViewPager()
pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager()));
indicator.setViewPager(pager);
indicator.notifyDataSetChanged();
FragmentPagerAdapter
public class MyFragmentPageAdapter extends FragmentPagerAdapter
public MyFragmentPageAdapter(FragmentManager fm)
super(fm);
@Override
public Fragment getItem(int position)
return FragmentB.newInstance(position);
@Override
public int getCount()
return 2;
@Override
public CharSequence getPageTitle(int position)
String title = "";
if (position == 0)
title = "Fragment B1";
else if (position == 1)
title = "Fragment B2";
return title;
片段 B
public static FragmentB newInstance(int position)
FragmentB f = new FragmentB();
Bundle b = new Bundle();
b.putInt(POSITION_IN_PAGER_ARGUMENT, position);
f.setArguments(b);
return f;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
super.onCreateView(inflater, container, savedInstanceState);
Log.d(TAG, "onCreateView");
View root = inflater.inflate(R.layout.fragment_b_layout, container, false);
empty = (TextView) root.findViewById(R.id.empty);
list = (ListView) root.findViewById(R.id.list);
return root;
@Override
public void onStart()
super.onStart();
Log.d(TAG, "onStart");
populateListView(loadData());
@Override
public void onStop()
super.onStop();
【问题讨论】:
你的 FragmentPagerAdapter 看起来很空 è.è 您找到解决方案了吗?一段时间以来一直被同样的问题困扰。 大家好。我有确切的问题。你有没有为此想出解决方案? 【参考方案1】:使用 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter。它对我有用。但是如果您的 ViewPager 有很多视图要显示,则会出现内存问题(仅在屏幕方向改变时)。
【讨论】:
因为它必须重建视图,因为生命周期重新开始。 经过几天的挫折,这对我来说是可以接受的解决方案。应标记为已接受的答案。 我遇到了这个问题,当我更改为 FragmentStatePagerAdapter 时,它对我不起作用【参考方案2】:这是我的带有标签的 PagerDadapter,也许它可以帮助你一点:
public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args)
clss = _class;
args = _args;
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager)
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
/**
* methode qui construit un onglet
*
* @param tab
* @param clss
* @param args
*/
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args)
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
@Override
public int getCount()
return mTabs.size();
@Override
public Fragment getItem(int position)
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
public void onPageSelected(int position)
mActionBar.setSelectedNavigationItem(position);
((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu();
public void onPageScrollStateChanged(int state)
public void onTabSelected(Tab tab, FragmentTransaction ft)
//
// force l'appel de onOptionMenuPrepared
((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu();
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++)
if (mTabs.get(i) == tag)
mViewPager.setCurrentItem(i);
public void onTabUnselected(Tab tab, FragmentTransaction ft)
public void onTabReselected(Tab tab, FragmentTransaction ft)
【讨论】:
以上是关于ViewPager 片段重新创建,已恢复但不可见的主要内容,如果未能解决你的问题,请参考以下文章