Retrieve a Fragment from a ViewPager

前端 未结 23 2513
逝去的感伤
逝去的感伤 2020-11-21 11:13

I\'m using a ViewPager together with a FragmentStatePagerAdapter to host three different fragments:

  • [Fragment1]
  • [Fragment2]<
相关标签:
23条回答
  • 2020-11-21 11:47

    Best solution is to use the extension we created at CodePath called SmartFragmentStatePagerAdapter. Following that guide, this makes retrieving fragments and the currently selected fragment from a ViewPager significantly easier. It also does a better job of managing the memory of the fragments embedded within the adapter.

    0 讨论(0)
  • 2020-11-21 11:48

    In order to get current Visible fragment from ViewPager. I am using this simple statement and it's working fine.

          public Fragment getFragmentFromViewpager()  
          {
             return ((Fragment) (mAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem())));
          }
    
    0 讨论(0)
  • 2020-11-21 11:53

    The main answer relies on a name being generated by the framework. If that ever changes, then it will no longer work.

    What about this solution, overriding instantiateItem() and destroyItem() of your Fragment(State)PagerAdapter:

    public class MyPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
    
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public int getCount() {
            return ...;
        }
    
        @Override
        public Fragment getItem(int position) {
            return MyFragment.newInstance(...); 
        }
    
        @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);
        }
    }
    

    This seems to work for me when dealing with Fragments that are available. Fragments that have not yet been instantiated, will return null when calling getRegisteredFragment. But I've been using this mostly to get the current Fragment out of the ViewPager: adapater.getRegisteredFragment(viewPager.getCurrentItem()) and this won't return null.

    I'm not aware of any other drawbacks of this solution. If there are any, I'd like to know.

    0 讨论(0)
  • 2020-11-21 11:54

    I implemented this easy with a bit different approach.

    My custom FragmentAdapter.getItem method returned not new MyFragment(), but the instance of MyFragment that was created in FragmentAdapter constructor.

    In my activity I then got the fragment from the adapter, check if it is instanceOf needed Fragment, then cast and use needed methods.

    0 讨论(0)
  • 2020-11-21 11:55

    The easiest and the most concise way. If all your fragments in ViewPager are of different classes you may retrieve and distinguish them as following:

    public class MyActivity extends Activity
    {
    
        @Override
        public void onAttachFragment(Fragment fragment) {
            super.onAttachFragment(fragment);
            if (fragment.getClass() == MyFragment.class) {
                mMyFragment = (MyFragment) fragment;
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-21 11:57

    In Fragment

    public int getArgument(){
       return mPage;
    {
    public void update(){
    
    }
    

    In FragmentActivity

    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    for(Fragment f:fragments){
        if((f instanceof PageFragment)&&(!f.isDetached())){
              PageFragment pf = (PageFragment)f;   
              if(pf.getArgument()==pager.getCurrentItem())pf.update();
        }
    }
    
    0 讨论(0)
提交回复
热议问题