28 votes

Bouton dans le ViewPager permettant d'accéder à une page spécifique

L'une de mes mises en page dans mon ViewPager comporte un bouton. "R.layout.add_site". J'aimerais avoir la possibilité d'appuyer sur le bouton pour qu'il défile jusqu'à la page spécifique pour moi. J'ai déjà la possibilité de faire défiler jusqu'à la page en question, mais j'aimerais avoir les deux.

Je suis sûr qu'il y a un moyen de le faire, mais pour une raison quelconque, je n'arrive pas à le comprendre.

Vous verrez que j'ai fait une tentative, mais que je ne sais pas quelle méthode appeler pour faire défiler la page souhaitée. Laquelle est R.layout.main.

Voici mon code.

public class fieldsActivity extends Activity {

Button addSiteButton;
Button cancelButton;
Button signInButton;

/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    Pager adapter = new Pager();
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
    mPager.setAdapter(adapter);
    mPager.setCurrentItem(1);

    addSiteButton = (Button) findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
        // Don't know what method to call!?

        }

    });

    cancelButton = (Button) findViewById(R.id.cancel_button);
    signInButton = (Button) findViewById(R.id.sign_in_button);

}

 private class Pager extends PagerAdapter {
    public int getCount() {
        return 3;

    }

    @Override
    public Object instantiateItem(View collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        int resId = 0;
        switch (position) {
            case 0:
                resId = R.layout.field01;
                break;
            case 1:
                resId = R.layout.add_site;

                break;
            case 2:
                resId = R.layout.main;
                break;

        }

        View view = inflater.inflate(resId, null);
        ((ViewPager) collection).addView(view, 0);
        return view;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);
    }
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);
    }
    @Override
    public Parcelable saveState() {
        return null;
    }

}

}

Toute aide est appréciée !

71voto

Ercan Points 1280

Appeler :

 mPager.setCurrentItem(2);

dans votre méthode onClick(), ou pour un défilement plus fluide :

mPager.setCurrentItem(2, true);

3voto

Naveen Kumar M Points 4060

Je ne peux pas vraiment répondre à la question de savoir POURQUOI exactement cela se produit, mais si vous retardez l'appel setCurrentItem de quelques millisecondes, cela devrait fonctionner. Je pense que c'est parce que pendant onResume il n'y a pas encore eu de passage de rendu, et le ViewPager en a besoin ou quelque chose comme ça.

private ViewPager viewPager;

@Override
public void onResume() {
    final int pos = 3;
    viewPager.postDelayed(new Runnable() {

        @Override
        public void run() {
            viewPager.setCurrentItem(pos);
        }
    }, 100);
}

Réponse originale : ici

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