如何防止在方向更改时重新创建片段寻呼机中的片段?
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;
【讨论】:
以上是关于如何防止在方向更改时重新创建片段寻呼机中的片段?的主要内容,如果未能解决你的问题,请参考以下文章