创建了一个实现FragmentStatePagerAdapter
的类,并提供了函数@Override public Fragment getItem(int position)
,我只是在其中创建和重新调整片段实例。
然后我有两个功能,只是改变ViewPager
中的当前页面。
public void next() {
this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1);
}
public void prev() {
this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1);
}
因此,每当页面发生变化时,我都没有接到任何生命周期函数的调用,因此当页面变得可见,隐藏等时我可以做出任何决定......
问题
如何正确实施ViewPager for Wizard内容(例如注册或投票)
此外,我还阅读了类似下面的代码,以正确更改/替换片段。但是如何将它与ViewPager一起使用?
请告诉我
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
答案 0 :(得分:0)
默认情况下,FragmentStatePagerAdapter会将相邻片段预加载到显示片段的片段。
表示如果片段0显示片段1也会加载它。 类似地,如果片段5显示,那么4和6也将加载它。
因此当你从4滑动到5时,5的生命周期不会被调用,因为它已被调用。
您需要实现OnPageChangeListener来识别更改。
答案 1 :(得分:0)
试试这个:
在 onCreate(),
pager = (ViewPager) findViewById(R.id.pager);
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
// Here you can specify how many pages(Fragments) to load.
pager.setOffscreenPageLimit(3);
pager.setPageMargin(pageMargin);
// Setting PageChangeListener...
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
}
@Override
public void onPageSelected(int position)
{
// Here, you have a current selected page
}
@Override
public void onPageScrollStateChanged(int state)
{
}
});
// This method is used to get the current selected fragment from `ViewPager`
private YourFragment getCurrentFragment()
{
YourFragment fragment = (YourFragment) adapter.getRegisteredFragment(pager.getCurrentItem());
return fragment;
}
现在,FragmentStatePagerAdapter
代码
public class MyPagerAdapter extends FragmentStatePagerAdapter
{
// Titles of the fragments
private final String[] TITLES = { ... };
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public CharSequence getPageTitle(int position)
{
return TITLES[position];
}
@Override
public int getCount()
{
return TITLES.length;
}
@Override
public Fragment getItem(int position)
{
if (position == 0)
{
return Fragment1.newInstance(position);
}
else if (position == 1)
{
return Fragment2.newInstance(position);
}
else if (position == 2)
{
return Fragment3.newInstance(position);
}
return Fragment4.newInstance(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position)
{
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position)
{
return registeredFragments.get(position);
}
}
希望这会帮助你。