Puis-je utiliser le pager avec des vues (pas avec des fragments)

J’utilise ViewPager pour glisser entre les Fragments , mais puis-je utiliser ViewPager pour ViewPager entre la présentation XML simple de Views ?

Ceci est ma page Adapter pour le ViewPager qui est utilisé pour glisser entre les fragments:

 import java.util.List; import com.app.name.fragments.TipsFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.view.ViewGroup; public class PageAdapter extends FragmentPagerAdapter { /** * */ List fragments; public PageAdapter(FragmentManager fm,List frags) { super(fm); fragments = frags; } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return TipsFragment.newInstance(0, 0); } @Override public int getCount() { // TODO Auto-generated method stub return 4; } @Override public void destroyItem(ViewGroup container, int position, Object object) { FragmentManager manager = ((Fragment) object).getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment) object); trans.commit(); super.destroyItem(container, position, object); } } 

Et voici mon fragment de pourboire:

 public class TipsFragment extends Fragment { public static TipsFragment newInstance(int image,int content) { TipsFragment fragment = new TipsFragment(); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tip_layout, null); return view; } } 

Comment puis-je modifier mon code pour travailler avec Views au lieu de Fragment?

Vous devez remplacer ces deux méthodes plutôt que getItem() :

 @Override public Object instantiateItem(ViewGroup collection, int position) { View v = layoutInflater.inflate(...); ... collection.addView(v,0); return v; } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((View) view); } 

Utilisez cet exemple

Vous pouvez utiliser une seule disposition XML imbriquant les vues enfants.

            

MAIS … vous devez également gérer cela avec un adaptateur. Ici, nous retournons l’ID de la vue trouvée sans gonfler une autre disposition.

 class WizardPagerAdapter extends PagerAdapter { public Object instantiateItem(ViewGroup collection, int position) { int resId = 0; switch (position) { case 0: resId = R.id.page_one; break; case 1: resId = R.id.page_two; break; } return findViewById(resId); } @Override public int getCount() { return 2; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // No super } } 

// Définir l’adaptateur ViewPager

 WizardPagerAdapter adapter = new WizardPagerAdapter(); ViewPager pager = (ViewPager) findViewById(R.id.pager); pager.setAdapter(adapter); 

Nous avons construit une sous-classe très simple de ViewPager que nous utilisons parfois.

 /** * View pager used for a finite, low number of pages, where there is no need for * optimization. */ public class StaticViewPager extends ViewPager { /** * Initialize the view. * * @param context * The application context. */ public StaticViewPager(final Context context) { super(context); } /** * Initialize the view. * * @param context * The application context. * @param attrs * The requested atsortingbutes. */ public StaticViewPager(final Context context, final AtsortingbuteSet attrs) { super(context, attrs); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // Make sure all are loaded at once final int childrenCount = getChildCount(); setOffscreenPageLimit(childrenCount - 1); // Attach the adapter setAdapter(new PagerAdapter() { @Override public Object instantiateItem(final ViewGroup container, final int position) { return container.getChildAt(position); } @Override public boolean isViewFromObject(final View arg0, final Object arg1) { return arg0 == arg1; } @Override public int getCount() { return childrenCount; } @Override public void destroyItem(final View container, final int position, final Object object) {} }); } } 

Cette classe n’a pas besoin d’un adaptateur car elle chargera les vues depuis la mise en page. Pour l’utiliser, utilisez-le plutôt que android.support.v4.view.ViewPager .

Tous les trucs de fantaisie fonctionneront toujours, mais vous n’avez pas besoin de vous soucier des adaptateurs.

Sur la base des réponses précédentes, j’ai fait le cours suivant pour y parvenir de manière correcte et claire (j’espère):

 public class MyViewPagerAdapter extends PagerAdapter { ArrayList views; LayoutInflater inflater; public MyViewPagerAdapter(ActionBarActivity ctx){ inflater = LayoutInflater.from(ctx); //instantiate your views list views = new ArrayList(5); } /** * To be called by onStop * Clean the memory */ public void release(){ views.clear(); views = null; } /** * Return the number of views available. */ @Override public int getCount() { return 5; } /** * Create the page for the given position. The adapter is responsible * for adding the view to the container given here, although it only * must ensure this is done by the time it returns from * {@link #finishUpdate(ViewGroup)}. * * @param container The containing View in which the page will be shown. * @param position The page position to be instantiated. * @return Returns an Object representing the new page. This does not * need to be a View, but can be some other container of * the page. ,container */ public Object instantiateItem(ViewGroup container, int position) { ViewGroup currentView; Log.e("MyViewPagerAdapter", "instantiateItem for " + position); if(views.size()>position&&views.get(position) != null){ Log.e("MyViewPagerAdapter", "instantiateItem views.get(position) " + views.get(position)); currentView = views.get(position); } else{ Log.e("MyViewPagerAdapter", "instantiateItem need to create the View"); int rootLayout = R.layout.view_screen; currentView = (ViewGroup) inflater.inflate(rootLayout, container, false); ((TextView)currentView.findViewById(R.id.txvTitle)).setText("My Views " + position); ((TextView)currentView.findViewById(R.id.btnButton)).setText("Button"); ((ImageView)currentView.findViewById(R.id.imvPicture)).setBackgroundColor(0xFF00FF00); } container.addView(currentView); return currentView; } /** * Remove a page for the given position. The adapter is responsible * for removing the view from its container, although it only must ensure * this is done by the time it returns from {@link #finishUpdate(ViewGroup)}. * * @param container The containing View from which the page will be removed. * @param position The page position to be removed. * @param object The same object that was returned by * {@link #instantiateItem(View, int)}. */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } /** * Determines whether a page View is associated with a specific key object * as returned by {@link #instantiateItem(ViewGroup, int)}. This method is * required for a PagerAdapter to function properly. * * @param view Page View to check for association with object * @param object Object to check for association with view * @return true if view is associated with the key object object */ @Override public boolean isViewFromObject(View view, Object object) { return view==((View)object); } } 

Et vous devez le définir dans votre activité:

 public class ActivityWithViewsPaged extends ActionBarActivity { /** * The page Adapter: Manage the list of views (in fact here, its fragments) * And send them to the ViewPager */ private MyViewPagerAdapter pagerAdapter; /** * The ViewPager is a ViewGroup that manage the swipe from left * to right to left. * Like a listView with a gesture listener... */ private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_with_views); // Find the viewPager viewPager = (ViewPager) super.findViewById(R.id.viewpager); // Instantiate the PageAdapter pagerAdapter = new MyViewPagerAdapter(this); // Affectation de l'adapter au ViewPager viewPager.setAdapter(pagerAdapter); viewPager.setClipToPadding(false); viewPager.setPageMargin(12); // Add animation when the page are swiped // this instanciation only works with honeyComb and more // if you want it all version use AnimatorProxy of the nineoldAndroid lib //@see:http://stackoverflow.com/questions/15767729/backwards-compatible-pagetransformer if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ viewPager.setPageTransformer(true, new PageTransformer()); } } @Override protected void onStop() { super.onStop(); pagerAdapter.release(); } 

Où les fichiers XML sont évidents view_screen.xml:

            

Et ActivtyMain a la disposition suivante:

    

Un grand merci à Brian et Nicholas pour votre réponse, j’espère que j’appendai des informations plus claires et soulignerai quelques bonnes pratiques pour cette fonctionnalité.

Je voudrais élaborer sur la réponse @Nicholas, vous pouvez obtenir les vues par id ou si elles sont ajoutées dynamicment, obtenez la vue directement en fonction de sa position

 class WizardPagerAdapter extends PagerAdapter { public Object instantiateItem(View collection, int position) { View v = pager.getChildAt(position); return v; } @Override public int getCount() { return 3; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View) arg1); } } 

Je voudrais append ma solution ici. Étant donné que vous n’avez pas besoin d’utiliser de fragments, vous pouvez toujours créer un PagerAdapter qui associe des views au lieu de fragments à ViewPager .

Étendre PagerAdapter au lieu de FragmentPagerAdapter

 public class CustomPagerAdapter extends PagerAdapter { private Context context; public CustomPagerAdapter(Context context) { super(); this.context = context; } @Override public Object instantiateItem(ViewGroup collection, int position) { LayoutInflater inflater = LayoutInflater.from(context); View view = null; switch (position){ case 0: view = MemoryView.getView(context, collection); break; case 1: view = NetworkView.getView(context, collection); break; case 2: view = CpuView.getView(context, collection); break; } collection.addView(view); return view; } @Override public int getCount() { return 3; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((View) view); } } 

Vous devez maintenant définir trois classes qui viewpager les views à gonfler dans le viewpager . Semblable à CpuView vous aurez des classes MemoryView et NetworkView . Chacun d’eux va gonfler leurs dispositions respectives.

 public class CpuView { public static View getView(Context context, ViewGroup collection) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context .LAYOUT_INFLATER_SERVICE); return inflater.inflate(R.layout.debugger_cpu_layout, collection, false); } } 

Et enfin une mise en page qui sera gonflée dans chacune des vues

      

PS: La raison pour laquelle j’ai écrit cette réponse est que toutes les solutions proposées ici semblent fonctionner correctement, mais elles gonflent les dispositions dans la classe PagerAdapter elle-même. Pour les grands projets, il devient difficile de maintenir une quantité de code liée aux mises en page gonflées. Maintenant, dans cet exemple, toutes les vues ont des classes et des mises en page distinctes. Le projet peut donc être facilement maintenu.

oui … vous pouvez utiliser View au lieu de Fragment dans viewpager. Ici vous pouvez trouver l’exemple complet qui vous aidera à atteindre Viewpager sans fragment. Passez par ce lien. entrez la description du lien ici