【问题标题】:How to get restored Fragment instance from onCreate's Bundle?如何从 onCreate 的 Bundle 中恢复 Fragment 实例?
【发布时间】:2014-08-01 16:31:53
【问题描述】:

我有一个 Activity,其中包含一些在 onCreate() 中创建并由 FragmentPagerAdapter(在 getItem(int) 中)返回的片段。这很好用。如果 Activity 被销毁然后重新创建(通过让手机进入睡眠状态很容易重现)旧的 Fragments 会通过调用 super.onCreate(Bundle) 自动恢复,因为我将“savedInstanceState”传递给它。这就是我想要的。

问题是,我如何获得对这些片段的引用?它们正在创建中,但我无法访问它们。现在我每次调用 onCreate() 时都在重新创建片段,这并不理想。

必须有办法做到这一点,对吧?

编辑:我根本没有使用 FragmentManager。我正在使用 FragmentPagerAdapter。下面是一个例子。自定义片段是在 onCreate() 中创建的,我希望指向重新创建的片段。我需要引用这些片段,因为活动有时会调用它们的方法。

public class SectionsPagerAdapter extends FragmentPagerAdapter
{
    public SectionsPagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        Fragment fragment = null;

        switch (position)
        {
            case 0:
                fragment = myCustomFragment1;
                break;

            case 1:
                fragment = myCustomFragment2;
                break;

            case 2:
                fragment = myCustomFragment3;
                break;
        }

        return fragment;
    }

    @Override
    public int getCount()
    {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position)
    {
        switch (position)
        {
            default:
            case 0:
                return "Fragment Title 1";

            case 1:
                return "Fragment Title 2";

            case 2:
                return "Fragment Title 3";
        }
    }
}

【问题讨论】:

    标签: android android-activity android-fragments


    【解决方案1】:

    您可以按 ID 或标签检索片段,具体取决于您创建片段的方式。

    例如,在您的Activity:

    按 ID:

    // Fragment setup, with no tag
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_slot_in_the_layout, myFragment);
    ft.commit();
    
    ...
    
    // Now, we retrieve the fragment, somewhere else. 
    // We can only do it by ID as no tag is available.
    final FragmentManager fm = getSupportFragmentManager(); 
    final Fragment fragment = fm.findFragmentById(R.id.fragment_slot_in_the_layout);
    

    按标签:

    // Fragment setup, using a tag
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_slot_in_the_layout, myFragment, TAG_THAT_YOU_HAVE_DEFINED);
    ft.commit();
    
    ...
    
    // Now, we retrieve the fragment, somewhere else. 
    // You have the choice, you can retrieve it by ID or by tag as both are available. 
    // In this example we retrieve it by tag.
    final FragmentManager fm = getSupportFragmentManager(); 
    final Fragment fragment = fm.findFragmentByTag(TAG_THAT_YOU_HAVE_DEFINED);
    

    (如果您不使用支持库,请使用Activity.getFragmentManager() 而不是Activity.getSupportFragmentManager()

    【讨论】:

    • 不幸的是,我没有在任何地方使用 FragmentTransaction。我只是在 SectionsPagerAdapter.getItem(int) 中返回一个已经创建的片段。我已经编辑了我的原始问题以显示这一点(这里没有空间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多