Android 更改或替换ViewPager中的片段
创建了一个类,该类实现了Android 更改或替换ViewPager中的片段,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,创建了一个类,该类实现了FragmentStatePagerAdapter,并提供了函数@Override public Fragment getItem(int position),我只是在其中创建并重新调整片段实例 然后我有两个函数,它只是在ViewPager中更改当前页面 public void next() { this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1); } public void prev() {
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);
}
因此,每当页面被更改时,我不会收到任何生命周期函数内部的调用,这样我就可以在页面变得可见、隐藏等时做出任何决定
问题
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
默认情况下,FragmentStatePagerAdapter预加载显示片段的相邻片段 意味着如果片段0显示片段1,则也会加载该片段。 同样,如果片段5显示,那么4和6也将加载它 因此,当你从4滑到5时,5的生命周期将不会像以前那样被调用
您需要实现OnPageChangeListener来识别更改 FragmentStatePagerAdapter默认情况下预加载显示片段的相邻片段 意味着如果片段0显示片段1,则也会加载该片段。 同样,如果片段5显示,那么4和6也将加载它 因此,当你从4滑到5时,5的生命周期将不会像以前那样被调用 您需要实现OnPageChangeListener来识别更改 试试这个: 在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
code
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);
}
}
公共类MyPagerAdapter扩展了FragmentStatePagerAdapter
{
//片段的标题
私有最终字符串[]标题={…};
SparseArray registeredFragments=新SparseArray();
公共MyPagerAdapter(碎片管理器fm)
{
超级(fm);
}
@凌驾
公共字符序列getPageTitle(int位置)
{
返回标题[职位];
}
@凌驾
public int getCount()
{
返回标题。长度;
}
@凌驾
公共片段getItem(int位置)
{
如果(位置==0)
{
返回碎片1.newInstance(位置);
}
否则如果(位置==1)
{
返回碎片2.newInstance(位置);
}
否则如果(位置==2)
{
返回碎片3.newInstance(位置);
}
返回碎片4.newInstance(位置);
}
@凌驾
公共对象实例化项(视图组容器,int位置)
{
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象)
{
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getRegisteredFragment(int位置)
{
返回registeredFragments.get(位置);
}
}
希望这能帮到你。试试这个:
在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
code
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);
}
}
公共类MyPagerAdapter扩展了FragmentStatePagerAdapter
{
//片段的标题
私有最终字符串[]标题={…};
SparseArray registeredFragments=新SparseArray();
公共MyPagerAdapter(碎片管理器fm)
{
超级(fm);
}
@凌驾
公共字符序列getPageTitle(int位置)
{
返回标题[职位];
}
@凌驾
public int getCount()
{
返回标题。长度;
}
@凌驾
公共片段getItem(int位置)
{
如果(位置==0)
{
返回碎片1.newInstance(位置);
}
否则如果(位置==1)
{
返回碎片2.newInstance(位置);
}
否则如果(位置==2)
{
返回碎片3.newInstance(位置);
}
返回碎片4.newInstance(位置);
}
@凌驾
公共对象实例化项(视图组容器,int位置)
{
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象)
{
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getRegisteredFragment(int位置)
{
返回registeredFragments.get(位置);
}
}
希望这能对您有所帮助。检查此链接并交叉检查您的查看寻呼机实现检查此@VivekMishra我检查了您共享的链接,但仍然没有回答我的问题。我有工作代码,但我想在我的视图被ViewPager和FragmentManger取代时打开生命周期调用。@GauravPolekar我遵循了您提到的相同android教程。但我的问题是在那之后。如果您再次阅读我的问题,我将不胜感激。如果您是手动滑动页面,那么我认为pageChangeListener应该工作检查此链接并交叉检查您的查看页面实现检查此@VivekMishra我检查了您共享的链接,但我的问题仍然没有得到回答。我有工作代码,但我想在我的视图被ViewPager和FragmentManger取代时打开生命周期调用。@GauravPolekar我遵循了您提到的相同android教程。但我的问题是在那之后。如果您能阅读我的问题,我将不胜感激