web-dev-qa-db-fra.com

Android view pager avec indicateur de page

Je dois obtenir un indicateur de page dans le fichier de visualisation avec des images. Voici mon code.

public class IndicatorActivity extends Activity {


 /** Called when the activity is first created. */
    @Override

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            MyPagerAdapter adapter = new MyPagerAdapter();
            ViewPager myPager = (ViewPager) findViewById(R.id.pager);
            myPager.setAdapter(adapter);
            myPager.setCurrentItem(0);
            TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicat);
            indicator.setViewPager( myPager );
    }
}

Dans ce code, j'ai eu une erreur dans TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicat); en tant que TitlePageIndicator cannot be resolved to a type. Quelle est cette erreur? Comment puis-je le résoudre?

voici mon code xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <Android.support.v4.view.ViewPager
        Android:id="@+id/pager"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
         />
    <com.viewpagerindicator.TitlePageIndicator
    Android:id="@+id/indicat"
    Android:layout_height="wrap_content"
    Android:layout_width="fill_parent" />
</LinearLayout>

Quel code dois-je écrire dans la variable TitlePageIndicator? Je veux le faire sans utiliser de fragments .

Moi aussi j'ai créé une classe telle que:

class MyPagerAdapter extends PagerAdapter {

     private static Integer[] titles = new Integer[] 
                { 
        R.drawable.jk,R.drawable.lm,R.drawable.no
                };

    public int getCount() {
            return 3;
    }

    public Object instantiateItem(View collection, int position) {

            LayoutInflater inflater = (LayoutInflater) collection.getContext()
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view;
            ImageView iv;

            view = inflater.inflate(R.layout.first, null);

            ((ViewPager) collection).addView(view, 0);
            switch (position) {
            case 0:
                iv = (ImageView)view.findViewById(R.id.imageView1);
                iv.setImageResource(titles[position]);
                    break;
            case 1:
                iv = (ImageView)view.findViewById(R.id.imageView1);
                iv.setImageResource(titles[position]);
                    break;
            case 2:
                 iv = (ImageView)view.findViewById(R.id.imageView1);
                iv.setImageResource(titles[position]);
                    break;
            }
            return view;
    }

    public void destroyItem(View arg0, int arg1, Object arg2) {
            ((ViewPager) arg0).removeView((View) arg2);

    }



    public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == ((View) arg1);

    }

}

Est-ce que je voulais faire autre chose que ce cours?

Merci d'avance pour votre aide

26
user1602259

Voici quelques choses à faire:

1-Téléchargez la bibliothèque si vous ne l'avez pas déjà fait.

2- Importer dans Eclipse.

3- Configurez votre projet pour utiliser la bibliothèque: Projet-> Propriétés -> Android -> Faites défiler l'écran jusqu'à la section Bibliothèque, cliquez sur Ajouter ... et sélectionnez viewpagerindicator.

4- Vous devriez maintenant pouvoir importer com.viewpagerindicator.TitlePageIndicator.

Maintenant, pour implémenter ceci sans utiliser de fragments:

Dans l'exemple fourni avec viewpagerindicatior, vous pouvez voir que la bibliothèque est utilisée avec une ViewPager qui a une FragmentPagerAdapter.

Mais en réalité, la bibliothèque elle-même est Fragment indépendante. Il faut juste une ViewPager. Il suffit donc d’utiliser une PagerAdapter au lieu de FragmentPagerAdapter et vous voilà prêt à partir.

12
Benito Bertoli

UPDATE: 22/03/2017

fragmentation principale:

       <FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:app="http://schemas.Android.com/apk/res-auto"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

            <Android.support.v4.view.ViewPager
                Android:id="@+id/viewpager"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent" />

            <RadioGroup
                Android:id="@+id/page_group"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center_horizontal|bottom"
                Android:layout_marginBottom="@dimen/margin_help_container"
                Android:orientation="horizontal">

                <RadioButton
                    Android:id="@+id/page1"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:checked="true" />

                <RadioButton
                    Android:id="@+id/page2"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content" />

                <RadioButton
                    Android:id="@+id/page3"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content" />
            </RadioGroup>
        </FrameLayout>

configurez la vue et l'événement sur votre fragment comme ceci:

        mViewPaper = (ViewPager) view.findViewById(R.id.viewpager);
        mViewPaper.setAdapter(adapder);

        mPageGroup = (RadioGroup) view.findViewById(R.id.page_group);
        mPageGroup.setOnCheckedChangeListener(this);

        mViewPaper.addOnPageChangeListener(this);

       *************************************************
       *************************************************

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        // when current page change -> update radio button state
        int radioButtonId = mPageGroup.getChildAt(position).getId();
        mPageGroup.check(radioButtonId);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        // when checked radio button -> update current page
        RadioButton checkedRadioButton = (RadioButton)radioGroup.findViewById(checkedId);
        // get index of checked radio button
        int index = radioGroup.indexOfChild(checkedRadioButton);

        // update current page
        mViewPaper.setCurrentItem(index), true);
    }

État de la case à cocher personnalisée: Case à cocher personnalisée image Android

Tutoriel Viewpager: http://architects.dzone.com/articles/Android-tutorial-using

enter image description here

53
vuhung3990

Je sais que la réponse à cette question a déjà été trouvée, mais pour quiconque recherche une implémentation simple et sans fioritures d'un indicateur ViewPager, j'en ai implémenté un que j'ai en source ouverte. Pour ceux qui trouvent la version de Jake Wharton un peu complexe pour leurs besoins, consultez https://github.com/jarrodrobins/SimpleViewPagerIndicator .

9
JRod

J'ai également utilisé SimpleViewPagerIndicator de @JROD. Il se bloque également comme décrit par @manuelJ.

Selon sa documentation:

SimpleViewPagerIndicator pageIndicator = (SimpleViewPagerIndicator) findViewById(R.id.page_indicator);
pageIndicator.setViewPager(pager);

Assurez-vous d'ajouter cette ligne également:

pageIndicator.notifyDataSetChanged();

Il se bloque avec une exception tableau hors limite, car SimpleViewPagerIndicator n'est pas instancié correctement et les éléments sont vides. L'appel de notifyDataSetChanged a pour résultat que toutes les valeurs sont correctement définies ou réinitialisées correctement.

5
Terence

Juste une amélioration de la réponse de Nice donnée par @ vuhung3990 . J'ai implémenté la solution et fonctionne très bien, mais si je touche un bouton radio, il sera sélectionné et rien ne se passera.

Je suggère de changer également de page quand un bouton radio est tapé. Pour ce faire, ajoutez simplement un auditeur au groupe radio:

mPager = (ViewPager) findViewById(R.id.pager);
final RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radiogroup);    
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.radioButton :
                        mPager.setCurrentItem(0, true);
                        break;
                    case R.id.radioButton2 :
                        mPager.setCurrentItem(1, true);
                        break;
                    case R.id.radioButton3 :
                        mPager.setCurrentItem(2, true);
                        break;
                }
            }
        });
2
Andrea

vous devez faire ce qui suit:

1-Téléchargez le projet complet à partir d'ici https://github.com/JakeWharton/ViewPagerIndicatorIndicateur ViewPager 2- Importation dans Eclipse.

Après l’importation, si vous souhaitez créer le type d’écran suivant, suivez les étapes ci-dessous -

Screen Shot

changer 

Échantillons de cercles Par défaut

  package com.viewpagerindicator.sample;
  import Android.os.Bundle;  
  import Android.support.v4.view.ViewPager;
  import com.viewpagerindicator.CirclePageIndicator;

  public class SampleCirclesDefault extends BaseSampleActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_circles);

    mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

    mPager = (ViewPager)findViewById(R.id.pager);
  //  mPager.setAdapter(mAdapter);

    ImageAdapter adapter = new ImageAdapter(SampleCirclesDefault.this);
    mPager.setAdapter(adapter);


    mIndicator = (CirclePageIndicator)findViewById(R.id.indicator);
    mIndicator.setViewPager(mPager);
  }
}

ImageAdapter 

 package com.viewpagerindicator.sample;

 import Android.content.Context;
 import Android.support.v4.view.PagerAdapter;
 import Android.support.v4.view.ViewPager;
 import Android.view.LayoutInflater;
 import Android.view.View;
 import Android.view.ViewGroup;
 import Android.widget.ImageView;
 import Android.widget.TextView;

 public class ImageAdapter extends PagerAdapter {
 private Context mContext;

 private Integer[] mImageIds = { R.drawable.about1, R.drawable.about2,
        R.drawable.about3, R.drawable.about4, R.drawable.about5,
        R.drawable.about6, R.drawable.about7

 };

 public ImageAdapter(Context context) {
    mContext = context;
 }

 public int getCount() {
    return mImageIds.length;
 }

 public Object getItem(int position) {
    return position;
 }

 public long getItemId(int position) {
    return position;
 }

 @Override
 public Object instantiateItem(ViewGroup container, final int position) {

    LayoutInflater inflater = (LayoutInflater) container.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View convertView = inflater.inflate(R.layout.gallery_view, null);

    ImageView view_image = (ImageView) convertView
            .findViewById(R.id.view_image);
    TextView description = (TextView) convertView
            .findViewById(R.id.description);

    view_image.setImageResource(mImageIds[position]);
    view_image.setScaleType(ImageView.ScaleType.FIT_XY);

    description.setText("The natural habitat of the Niligiri tahr,Rajamala          Rajamala is 2695 Mts above sea level"
        + "The natural habitat of the Niligiri tahr,Rajamala Rajamala is 2695 Mts above sea level"
                    + "The natural habitat of the Niligiri tahr,Rajamala Rajamala is 2695 Mts above sea level");

    ((ViewPager) container).addView(convertView, 0);

    return convertView;
 }

 @Override
 public boolean isViewFromObject(View view, Object object) {
    return view == ((View) object);
 }

 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((ViewGroup) object);
 }
}

gallery_view.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/about_bg"
Android:orientation="vertical" >

<LinearLayout
    Android:id="@+id/about_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:weightSum="1" >

    <LinearLayout
        Android:id="@+id/about_layout1"
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        Android:layout_weight=".4"
        Android:orientation="vertical" >

        <ImageView
            Android:id="@+id/view_image"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" 
            Android:background="@drawable/about1">
     </ImageView>
    </LinearLayout>

    <LinearLayout
        Android:id="@+id/about_layout2"
        Android:layout_width="fill_parent"
        Android:layout_height="0dp"
        Android:layout_weight=".6"
        Android:orientation="vertical" >

        <TextView
            Android:id="@+id/textView1"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:text="SIGNATURE LANDMARK OF MALAYSIA-SINGAPORE CAUSEWAY"
            Android:textColor="#000000"
            Android:gravity="center"
            Android:padding="18dp"
            Android:textStyle="bold"
            Android:textAppearance="?android:attr/textAppearance" />


        <ScrollView
            Android:layout_width="fill_parent"
            Android:layout_height="match_parent"
            Android:fillViewport="false"
            Android:orientation="vertical"
            Android:scrollbars="none"
            Android:layout_marginBottom="10dp"
            Android:padding="10dp" >

            <TextView
                Android:id="@+id/description"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:textColor="#000000"
                Android:text="TextView" />

            </ScrollView>
    </LinearLayout>
 </LinearLayout>

1
gAuRaV jAiN

Vous pouvez créer une mise en page linéaire contenant un tableau de TextView (mDots) . Pour représenter le textView en tant que points, indiquez cette source HTML dans votre code . Référez-vous à mon code . J'ai obtenu ces informations sur la chaîne Youtube TVAC Studio . Voici le code: `

    addDotsIndicator(0);
    viewPager.addOnPageChangeListener(viewListener);
}

public void addDotsIndicator(int position)
{
        mDots = new TextView[5];
        mDotLayout.removeAllViews();

        for (int i = 0; i<mDots.length ; i++)
        {
             mDots[i]=new TextView(this);
             mDots[i].setText(Html.fromHtml("&#8226;"));            //HTML for dots
             mDots[i].setTextSize(35);
             mDots[i].setTextColor(getResources().getColor(R.color.colorAccent));

             mDotLayout.addView(mDots[i]);
        }

        if(mDots.length>0)
        {
            mDots[position].setTextColor(getResources().getColor(R.color.orange));
        }
}

ViewPager.OnPageChangeListener viewListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int 
   positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {

        addDotsIndicator(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
};`
0
Rohan Bari