在ViewPager中更改或替换片段

时间:2016-03-10 07:23:26

标签: 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() {
    this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1);
}

因此,每当页面发生变化时,我都没有接到任何生命周期函数的调用,因此当页面变得可见,隐藏等时我可以做出任何决定......

问题

  1. 如何正确实施ViewPager for Wizard内容(例如注册或投票)

  2. 此外,我还阅读了类似下面的代码,以正确更改/替换片段。但是如何将它与ViewPager一起使用?

  3. 请告诉我

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
                   .replace(R.id.content_frame, fragment)
                   .commit();
    

2 个答案:

答案 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);
    }
}

希望这会帮助你。