【问题标题】:getSupportFragmentManager() contains empty fragments after standbygetSupportFragmentManager() 包含待机后的空片段
【发布时间】:2012-11-14 11:20:42
【问题描述】:

设备进入待机状态后,如果我调用getSupportFragmentManager(),我会得到一个FragmentManager,其中包含未初始化且所有变量都设置为null 的片段。

这里有一些代码:

this.mAdapter = new MyAdapter(getSupportFragmentManager());

this.mPager = (ViewPager) findViewById(R.id.pager);
this.mPager.setAdapter(mAdapter);

TabPageIndicator titleIndicator = (TabPageIndicator) findViewById(R.id.titles);
titleIndicator.setViewPager(mPager);
titleIndicator.setOnPageChangeListener(new OnPageChangeListener()
{
    @Override
    public void onPageSelected(int position)
    {
        mAdapter.getItem(position).onFocus();
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2)
    {
    }

    @Override
    public void onPageScrollStateChanged(int arg0)
    {
    }
});

这是 MyAdapter 类:

public static class MyAdapter extends FragmentStatePagerAdapter
{
    ArrayList<ExtendedFragment> tabs = new ArrayList<ExtendedFragment>();
    String[] titles = new String[] { "FRAG1", "FRAG2", "FRAG3", "FRAG4", "FRAG5", "FRAG6"};

    public MyAdapter(FragmentManager fm)
    {
        super(fm);

        tabs.add(new frag1());
        tabs.add(new frag2());
        tabs.add(new frag3());
        tabs.add(new frag4());
        tabs.add(new frag5());
        tabs.add(new frag6());
    }

    @Override
    public int getCount()
    {
        return tabs.size();
    }

    @Override
    public ExtendedFragment getItem(int position)
    {
        return tabs.get(position);
    }

    @Override
    public CharSequence getPageTitle(int position)
    {
        return titles[position];
    }
}

ExtendedFragment 实现了方法onFocus(),每个片段都会覆盖它,因为当标签获得焦点时我需要执行一些操作。当我从待机状态恢复设备并触发onFocus() 时,如果我尝试使用getView() 获取View,我会得到null

为什么我的视图是空的?

【问题讨论】:

标签: android tabs android-fragments android-viewpager android-fragmentactivity


【解决方案1】:

您可以尝试覆盖 onSaveInstanceState 方法。

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState != null) {
                mContentFragment = getSupportFragmentManager().getFragment(
                        savedInstanceState, "mContent");
            }
            if (mContentFragment == null) {
                mContentFragment = new YourFragment();
            }
    }

    public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            getSupportFragmentManager().putFragment(outState, "mContent",
            mContentFragment);
    }

【讨论】:

  • 我如何获得mContentFragment
  • 刚刚新建一个片段实例。
  • 很抱歉,我不能这样做getSupportFragmentManager().putFragment(outState, "mContent", mContentFragment);,因为我不知道FragmentManager 中的哪个片段。片段由TabPageIndicator 管理,我不知道如何检索包含在FragmentManager 中的片段数组以保存它们的状态。我正在使用 ViewPagerIndicator 库,因此片段管理完全取决于它。
  • ApiDemos 中有一个名为 FragmentTabs 的示例代码可能会有所帮助。
  • 在 ApiDemos 中,当设备处于横向模式时,他们使用ActionBar.ActionBar 中的标签而不是标签,但我需要标签,而不是微调器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多