我正在使用杰克沃顿的ViewPagerIndicator来制作可滑动的标签。目前我可以在我的应用程序中使用它,其中有4个选项卡。但显然,当我更改页面/标签时,每个片段都会重新创建。例如,如果我在选项卡A中,更改为选项卡C,然后返回选项卡A,则再次重新创建A选项卡的片段,而不是仅将旧选项卡放在页面前面。
我尝试按照库的示例。以下是我的代码的样子:
ProfileViewPagerActivity
private static final String[] TAB_TITLES = new String[] { "Info",
"Personal Event", "Favorite", "Attending" };
TestFragmentAdapter mAdapter;
ViewPager mPager;
PageIndicator mIndicator;
int action;
User user;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.simple_tabs);
action = getIntent().getIntExtra(Constants.LOAD_WHAT, Constants.LOAD_MY_PROFILE);
user = (User) getIntent().getSerializableExtra(Constants.USER);
mAdapter = new TestFragmentAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (TabPageIndicator) findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
这里的适配器是ProfileViewPagerActivity中的一个类
TestFragmentAdapter
private int mCount = TAB_TITLES.length;
public TestFragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return UserInfoFragment.newInstance(action,user);
case 1:
return EventListFragment.newInstance(user.getUsername(), Constants.LIST_MINE, action);
case 2:
return EventListFragment.newInstance(user.getUsername(), Constants.LIST_FAVORITE, action);
case 3:
return EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action);
}
return null;
}
@Override
public int getCount() {
return mCount;
}
@Override
public CharSequence getPageTitle(int position) {
return TAB_TITLES[position].toUpperCase(Locale.US);
}
使用上面的代码,每次更改选项卡时,片段都会重新创建。我尝试使用不同的方法,例如为TestFragmentAdapter构造函数中的每个片段调用newInstance()方法,然后只调用我在getItem方法中已经拥有的片段对象,它仍然不起作用。
我已经尝试过的另一个解决方案是在每个片段中保存SaveInstance,但也不行。我错过了什么吗?提前谢谢。
修改
对不起,我的错误,我想这不是“重新解决的片段”相关问题。在做了更多调试之后,我发现只有片段在FragmentAdapter中显示时才重新加载数据。在我的片段中,我在OnCreateView方法中从Web服务器加载数据。从android文档中,我想我应该在OnCreate方法中加载我需要的数据来解决这个问题,我是对的吗?感谢。
答案 0 :(得分:0)
您可以尝试让TestFragmentAdapter扩展FragmentPagerAdapter
。
答案 1 :(得分:0)
来自FragmentPagerAdapter
上的Android开发人员website:用户访问的每个网页的片段将保留在内存中,但其视图层次结构可能会在不可见时被销毁。
我相信android有自己的机制来保存内存。如果您不相信,您可以随时声明您的碎片:
private int mCount = TAB_TITLES.length;
private UserInfoFragment fragment0; // first fragment
private EventListFragment [] fragmentAt; // fragment 2,3,4
@Override
protected void onCreate(Bundle arg0) {
fragmentAt = new EventListFragment[mCount-1];
...
}
然后在TestFragmentAdapter
:
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
if(fragment0 == null) {
fragment0 = UserInfoFragment.newInstance(action,user);
}
return fragment0;
case 1:
case 2:
case 3:
if(fragmentAt[position-1] == null) {
fragmentAt[position-1] = EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action);
}
return fragmentAt[position-1];
}
}
这样,片段保证只创建一次。