将 viewpager 与特定片段一起使用
Using viewpager with specific fragments
我正在创建一个使用 viewpager 在 4 个特定片段之间滑动的应用程序。
我目前看过的所有viewpager的例子,每次调用FragmentPagerAdapter的getPosition方法都会创建新的fragment。所以它是这样的:
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 中每个片段的标签
我的问题是:
a) 每次都使用同一个片段是不是不对?我没有看到使用上述方法或类似方法的示例,它们总是在 getItem 方法中创建一个新实例
b) 如果我希望片段具有一些持久性,那么这是否意味着我应该将每个片段应持有的数据存储在静态变量中并始终创建使用这些变量的新实例?
a) 我觉得完全没问题。他们总是创建 ne 实例,因为它更容易,而且在许多情况下(如图片库)更好。
b) 如果您将应用程序发送到后台,然后 return 发送给它,静态变量会丢失。共享首选项或捆绑包应该可以完成工作。
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);
设置刷新限制。
你应该使用 FragmentStatePagerAdapter。如果您使用 fragmentstatepager 适配器,则可以动态删除或添加片段。
我正在创建一个使用 viewpager 在 4 个特定片段之间滑动的应用程序。
我目前看过的所有viewpager的例子,每次调用FragmentPagerAdapter的getPosition方法都会创建新的fragment。所以它是这样的:
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 中每个片段的标签
我的问题是:
a) 每次都使用同一个片段是不是不对?我没有看到使用上述方法或类似方法的示例,它们总是在 getItem 方法中创建一个新实例
b) 如果我希望片段具有一些持久性,那么这是否意味着我应该将每个片段应持有的数据存储在静态变量中并始终创建使用这些变量的新实例?
a) 我觉得完全没问题。他们总是创建 ne 实例,因为它更容易,而且在许多情况下(如图片库)更好。
b) 如果您将应用程序发送到后台,然后 return 发送给它,静态变量会丢失。共享首选项或捆绑包应该可以完成工作。
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);
设置刷新限制。
你应该使用 FragmentStatePagerAdapter。如果您使用 fragmentstatepager 适配器,则可以动态删除或添加片段。