我正在创建一个使用viewpager在4个特定片段之间滑动的应用。
到目前为止,我已阅读过viewpager的所有示例,每次调用FragmentPagerAdapter的getPosition方法时都会创建新的片段。所以它就像:
return FragmentA.newInstance();
我所做的是以下内容:
在主要活动中
public static final int FRAGMENTS = 4;
public static final String FRAGMENT_LIST ="LIST";
public static final String FRAGMENT_SETTINGS = "SETTINGS";
public static final String FRAGMENT_MAP = "MAP";
public static final String FRAGMENT_TICKET = "TICKET";
MainAdapter _adapter;
ViewPager _pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.add(new FragmentMap(), FRAGMENT_MAP)
.add(new FragmentList(), FRAGMENT_LIST)
.add(new FragmentTicket(), FRAGMENT_TICKET)
.add(new FragmentSettings(), FRAGMENT_SETTINGS)
.commit();
}
_adapter = new MainAdapter(getSupportFragmentManager());
_pager = (ViewPager) findViewById(R.id.pager);
_pager.setAdapter(_adapter);
}
并在适配器中:
public class MainAdapter extends FragmentPagerAdapter {
FragmentManager _manager;
public MainAdapter(FragmentManager fm) {
super(fm);
_manager = fm;
}
@Override
public Fragment getItem(int position) {
return _manager.getFragments().get(position);
}
@Override
public int getCount() {
return ActivityMain.FRAGMENTS;
}
}
这会引发异常,因为适配器正在尝试更改getItem
中每个片段的标记我的问题是:
a)每次总是使用相同的片段是不正确的?我没有看到使用上述方法或类似方法的示例,它们总是在getItem方法中创建一个新实例
b)如果我希望片段具有一些持久性,那么这是否意味着我应该将每个片段应该保存的数据存储在静态变量中并始终创建使用这些变量的新实例?
答案 0 :(得分:1)
a)您必须在getItem()
方法中创建一个新实例,每次从viewpager切换片段时都不会调用此方法。
我建议您使用适配器,如
public class MainAdapter extends FragmentPagerAdapter {
public MainAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
case 0 :
return new FragmentMap();
case 1 :
return new FragmentList();
case 2 :
return new FragmentTicket();
case 3 :
return new FragmentSettings();
default :
return null;
}
@Override
public int getCount() {
return ActivityMain.FRAGMENTS;
}
}
b)FragmentPagerAdapter中的片段是持久性的,只有在ViewPager中切换多个片段时才会重新创建片段。如果您不想在您的案例中重新创建片段,则可以按_pager.setOffscreenPageLimit(3);
设置刷新限制。
答案 1 :(得分:0)
a)我认为这完全没问题。他们总是创建ne实例,因为它更容易,并且在许多情况下(如图库)它更好。
b)如果您将应用程序发送到背景然后返回它,静态变量就会丢失。共享的prefferences或bundle应该可以完成工作。
答案 2 :(得分:0)
您应该使用FragmentStatePagerAdapter。如果您使用fragmentstatepager适配器,则可以动态删除或添加片段。