70 votes

Est-il possible d'accéder au Fragment en cours de visualisation par un ViewPager ?

J'ai une application avec un ViewPager et trois Fragment s. J'essaye de comprendre comment obtenir l'actuel Fragment pour que je puisse accéder à ses arguments.

J'ai un OnPageChangeListener saisit l'index actuel de la page, mais

ViewPager.getChildAt(int position);

renvoie un View . Quelle est la relation entre ce View et le courant Fragment ?

1voto

Anh Nguyen Points 146

Vous pouvez le faire : - Dans l'étendue de la classe d'un adaptateur de pagination de vue (tel que PagerAdapter , FragmentStatePagerAdapter...), remplacez la méthode instantiateItem :

@Override
public Object instantiateItem(ViewGroup container, int position) {
        final Fragment frag = (Fragment) super.instantiateItem(container, position);
        if(frag instanceof ListNoteOfTypeFragment){                
            final ListNoteOfTypeFragment listNoteOfTypeFragment = (ListNoteOfTypeFragment) frag;
            //do whatever you want with your fragment here
            listNoteOfTypeFragment.setNoteChangeListener(mListener);
        }
        return frag;
    }

1voto

Hox Points 21

Une réponse définitive qui fonctionne sans problème (mais un petit hack) :

quelque part dans la mise en page du fragment de page :

<FrameLayout android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" android:id="@+id/fragment_reference">
     <View android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
</FrameLayout>

dans la onCreateView() du fragment :

...
View root = inflater.inflate(R.layout.fragment_page, container, false);
ViewGroup ref = (ViewGroup)root.findViewById(R.id.fragment_reference);
ref.setTag(this);
ref.getChildAt(0).setTag("fragment:" + pageIndex);
return root;

et la méthode pour retourner le fragment du ViewPager, s'il existe :

public Fragment getFragment(int pageIndex) {        
        View w = mViewPager.findViewWithTag("fragment:" + pageIndex);
        if (w == null) return null;
        View r = (View) w.getParent();
        return (Fragment) r.getTag();
}

1voto

Dante Points 798

Cela a été expliqué ici : http://developer.Android.com/guide/topics/fundamentals/fragments.html

Dans OnCreateView vous devez retourner une vue pour dessiner une interface utilisateur pour votre fragment, je pense que c'est la relation.

Cette question pourrait également être similaire : Obtenir une vue ciblée à partir du ViewPager

0voto

dmapr Points 9

FragmentStatePagerWithCurrentAdapter de Jorge Garcia est une très bonne solution, mais elle nécessite une légère amélioration. Dans le cas où l'activité est détruite et recréée en réponse à un changement de configuration ou quelque chose comme ça, le getItem ne sera pas appelé pour les fragments qui ont été sauvegardés et récupérés par le gestionnaire de fragments. Donc je surcharge getItem normalement dans ma sous-classe et je mets le suivant dans le FragmentStatePagerWithCurrentAdapter

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Object item = super.instantiateItem(container, position);
    if ( item instanceof Fragment ) {
        pageReferenceMap.put(position, (Fragment)item);
    }
    return item;
}

L'instantiateItem est appelé à chaque fois que l'on accède au fragment dans cette position.

0voto

almisoft Points 313

Ou simplement sauvegarder tous les Fragments dans une carte :

public class MyFragment extends Fragment implements OnPageChangeListener {

    private ViewPager viewPager;
    private FragmentStatePagerAdapter viewAdapter;
    private View rootView;
    private Map<Integer, Fragment> fragments = new HashMap<Integer, Fragment>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.introdution, container, false);

        viewPager = (ViewPager) rootView.findViewById(R.id.pager);
        viewAdapter = new ViewAdapter(getFragmentManager());
        viewPager.setAdapter(viewAdapter);
        viewPager.addOnPageChangeListener(this);

        return rootView;

    }

    private class ViewAdapter extends FragmentStatePagerAdapter {

        public ViewAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }

        @Override
        public Fragment getItem(int position) {

            Fragment result = null;

            switch (position) {
                case 0: result = Fragment1.newInstance(); break;
                case 1: result = Fragment2.newInstance(); break;
            }

            if (result != null)
                fragments.put(position, result);

            return result;

        }

        @Override
        public int getCount() {

            return 2;
        }

    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    @Override
    public void onPageSelected(int position) {

        Fragment currentFragment = fragments.get(position);

    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X