如何防止在方向更改时重新创建片段寻呼机中的片段?

Posted

技术标签:

【中文标题】如何防止在方向更改时重新创建片段寻呼机中的片段?【英文标题】:How to prevent a fragment in a fragment pager from being recreated on orientation change? 【发布时间】:2016-06-10 01:10:41 【问题描述】:

我知道,通常对于片段,您可以在活动的 onCreate 中执行类似的操作来检索已创建的片段,该片段在方向更改时具有 .setRetainInstance(true),而不是创建新片段:

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) 
        TestFragment test = new TestFragment();
        test.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
     else 
        TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
    

我的问题是如何保留和检索视图页面中的此类片段?重新创建片段不是我想要的。即使我可以检索这些片段标记,viewpager 也会处理附加片段,因此似乎无法检查现有片段并检索它而不是创建一个新片段。这是我的活动和寻呼机:

public class MainActivity extends AppCompatActivity 

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager()));


    

    public class PagerAdapter extends FragmentStatePagerAdapter 
        public PagerAdapter(FragmentManager fm) 
            super(fm);
        

        @Override
        public Fragment getItem(int position) 
            switch (position)
                case 0:                       
                    return new FragmentA();
                case 1:
                    return new SettingsFragment();
                default:
                    return null;
            
        


        @Override
        public int getCount() 
            return 2;
        
    



【问题讨论】:

【参考方案1】:

ViewPager 自动标记片段,因此此处无法通过标记查找片段。但是,您可以通过覆盖FragmentPagerAdapter 类的instantiateItem(ViewGroup container, int position) 方法来保留对视图寻呼机创建的片段的引用。

   Fragment myFragment = null;

    public class PagerAdapter extends FragmentStatePagerAdapter 
        public PagerAdapter(FragmentManager fm) 
            super(fm);
        

        @Override
        public Fragment getItem(int position) 
            switch (position)
                case 0:                       
                    return new FragmentA();
                case 1:
                    return new SettingsFragment();
                default:
                    return null;
            
        


        @Override
        public int getCount() 
            return 2;
        

        @Override
        public Object instantiateItem(ViewGroup container, int position) 
            myFragment = (Fragment) super.instantiateItem(container, position);
            if (myFragment != null) 
                Log.i(TAG, "Fragment retrieved " + myFragment.toString());
            

            return myFragment;
        
    

【讨论】:

以上是关于如何防止在方向更改时重新创建片段寻呼机中的片段?的主要内容,如果未能解决你的问题,请参考以下文章

在片段中在运行时更改方向时更改布局而不重新创建视图

在方向更改时保留列表片段中的列表

重新附加时片段创建/恢复重复视图

如何在屏幕方向更改时附加片段?

如何从使用视图寻呼机创建的选项卡片段转移到另一个片段

如何防止片段在活动重新创建时触发 onCreate onCreateView