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 ?

46voto

James Points 1178

J'ai finalement trouvé une réponse qui a fonctionné pour moi. En gros, vous pouvez accéder au fragment pour une page viewPager en utilisant le tag "Android:switcher : "+R.id.viewpager+":0".

18voto

sdl Points 131

J'ai résolu ce problème dans l'autre sens. Au lieu de rechercher le fragment à partir de l'activité, j'enregistre le fragment pendant la méthode onAttach() de son activité propriétaire et je le désenregistre dans la méthode onStop(). Idée de base :

Fragment :

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try{
        mActivity = (IMyActivity)activity;
    }catch(ClassCastException e){
        throw new ClassCastException(activity.toString() +" must be a IMyActivity");
    }

    mActivity.addFragment(this);
}

@Override
public void onStop() {
    mActivity.removeFragment(this);
    super.onStop();
}

IMyActivité :

public interface IFriendActivity {
    public void addFragment(Fragment f);
    public void removeFragment(Fragment f); 
}

MonActivité :

public class MyActivity implements IMyActivity{

    [...]

    @Override
    public void addFragment(Fragment f) {
        mFragments.add(f);
    }

    @Override
    public void removeFragment(Fragment f) {
        mFragments.remove(f);
    }

}

5voto

Mike T Points 1837

Edit - Ne faites pas ça. Si vous êtes tenté de le faire, lisez les commentaires pour savoir pourquoi c'est une mauvaise idée.

Au cas où vous essayeriez encore de résoudre ce problème :

Étendre le site FragmentPagerAdapter . Dans le constructeur, construisez les fragments dont vous avez besoin et stockez-les dans une liste (array/ArrayList) de fragments.

private final int numItems = 3;
Fragment[] frags;

public SwipeAdapter (FragmentManager fm) {
    super(fm);

    //Instantiate the Fragments
    frags = new Fragment[numItems];

    Bundle args = new Bundle();
    args.putString("arg1", "foo");

    frags[0] = new MyFragment();
    frags[1] = new YourFragment();
    frags[2] = new OurFragment();
    frags[2].setArguments(args);
}

Ensuite, pour getItem(int position) vous pouvez faire quelque chose comme

public Fragment getItem(int position) {
    return frags[position];
}

Je ne sais pas si c'est la façon de faire généralement admise, mais cela a fonctionné pour moi.

Modifier

Ce n'est vraiment pas une bonne façon de faire. Si vous prévoyez de gérer les changements d'orientation ou de mettre votre application en arrière-plan, cela va probablement casser votre code. Veuillez lire les commentaires sous cette réponse pour plus d'informations. Utilisez plutôt la réponse de @James

4voto

Vladimir Kulyk Points 148

Oui, c'est possible si vous utilisez FragmentStatePagerAdapter .

ViewPager vp;
//...
YourFragment fragment = (YourFragment) adapter.instantiateItem(vp, vp.getCurrentItem());

3voto

Jorge Garcia Points 427

S'IL VOUS PLAÎT N'UTILISEZ PAS CECI

Faites en sorte que votre adaptateur étende les éléments suivants FragmentStatePagerWithCurrentAdapter et au lieu d'implémenter getItem implémenter le même code dans getItemAtIndex

Définissez le ViewPager OnPageChangeListener à l'instance de l'adaptateur.

Lorsque vous avez besoin d'accéder au Fragment courant, il suffit d'appeler adapter.getCurrentItem() .

package your.package;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.SparseArray;
import android.view.ViewGroup;

public abstract class FragmentStatePagerWithCurrentAdapter 
extends FragmentStatePagerAdapter 
implements OnPageChangeListener {
    int currentPage = 0;

    private SparseArray<Fragment> mPageReferenceMap = new SparseArray<Fragment>();

    public FragmentStatePagerWithCurrentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public final Fragment getItem(int index) {
        Fragment myFragment = getItemAtIndex(index);
        mPageReferenceMap.put(index, myFragment);
        return myFragment;
    }

    public abstract Fragment getItemAtIndex(int index);

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

        super.destroyItem(container, position, object);

        mPageReferenceMap.remove(Integer.valueOf(position));
    }

    public Fragment getCurrentItem() {
        return mPageReferenceMap.get(currentPage);
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {

    }

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

    }

    @Override
    public void onPageSelected(int newPageIndex) {
        currentPage = newPageIndex;
    }

}

J'ai utilisé comme référence l'article de blog suivant : http://tamsler.blogspot.com/2011/11/Android-viewpager-and-fragments-part-ii.html

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