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);
}
因此,每当页面被更改时,我不会收到任何生命周期函数内部的调用,这样我就可以在页面变得可见、隐藏等时做出任何决定

问题

  • 如何正确实现向导内容的ViewPager(例如注册或轮询)

  • 此外,我还阅读了下面的代码,以便正确地更改/替换片段。但是如何将其与ViewPager一起使用呢

  • 请让我知道

    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教程。但我的问题是在那之后。如果您能阅读我的问题,我将不胜感激