我正在创建一个使用 viewpager 在 4 个特定 fragment 之间滑动的应用。
到目前为止我看过的所有viewpager的例子,每次调用FragmentPagerAdapter的getPosition方法都会创建新的fragments。所以它是这样的:
return FragmentA.newInstance();
我所做的如下:
在主要 Activity 中
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 中每个 fragment 的标签
我的问题是:
a) 每次都使用相同的 fragment 是不是不正确?我没有看到使用上述方法或类似方法的示例,它们总是在 getItem 方法中创建一个新实例
b) 如果我希望 fragment 具有一些持久性,那么这是否意味着我应该将每个 fragment 应持有的数据存储在静态变量中并始终创建使用这些变量的新实例?
最佳答案
a) 您必须在 getItem()
方法中创建一个新实例,每次您从 viewpager 切换 fragment 时都不会调用此方法。
我建议你像这样使用你的适配器
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 中的 fragment 是持久的,只有当您在 ViewPager 中切换多个 fragment 时,它们才会被重新创建。例如,您可以通过 _pager.setOffscreenPageLimit(3);
设置刷新限制,如果您不想在您的案例中重新创建您的 fragment 。
关于android - 将 viewpager 与特定 fragment 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832260/