51

さて、私はViewPagerを利用してページを表示するAndroidアプリを開発しています。

各ページ内には、(ページ間のスワイプに加えて)ページ間を移動するために使用する一連のボタンがあります。これらのボタンは、「最初のページ」、「前のページ」、「次のページ」、「最後のページ」用です。

どうすればいいのかわからないのは、ボタンクリックでページ変更ができるメカニズムを設計することです。

誰かアイデアはありますか?

ETA:セットアップをよりよく説明するために、ボタンは各ページのレイアウト内で宣言され、PagerAdapter内の残りのレイアウトで拡張されます。私の問題は、PagerAdapter内からViewPagerを参照できないことです。または少なくとも、私はそれを行う方法を考えることはできません。

4

9 に答える 9

114

ボタン:

Button yourButton = (Button)findViewById(R.id.button1);
    yourButton.setOnClickListener(new OnClickListener() {

     @Override
           public void onClick(View view) {
               mViewPager.setCurrentItem(getItem(+1), true); //getItem(-1) for previous
           }
        });

働き:

private int getItem(int i) {
       return mViewPager.getCurrentItem() + i;
}

お役に立てれば :)

于 2012-11-08T09:17:31.167 に答える
45
yourButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
      yourViewPager.setCurrentItem(page, smoothScroll);
   }
});
于 2012-06-01T15:22:05.457 に答える
4

1)レイアウトを作成する

      <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:background="@color/white"
                android:weightSum="1">



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

                <ImageView
                    android:id="@+id/img_next"
                    android:layout_width="35dp"
                    android:layout_height="35dp"
                    android:src="@drawable/forward_white"
                    android:background="@color/colorPrimary"
                    android:layout_centerVertical="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginRight="5dp"
                    android:paddingTop="5dp"
                    android:paddingBottom="5dp"
                    />


                <ImageView
                    android:id="@+id/img_previous"
                    android:layout_width="35dp"
                    android:layout_height="35dp"
                    android:src="@drawable/back_white"
                    android:background="@color/colorPrimary"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="5dp"
                    android:layout_alignParentLeft="true"
                    android:paddingTop="5dp"
                    android:paddingBottom="5dp"/>


            </RelativeLayout>

2)カスタムアダプタを設定します

        CustomViewPagerAdapter  custompageradpter;
        ViewPager   mViewPager;
        mViewPager = (ViewPager)shareImagesDialouge.findViewById(R.id.images_pager); 
         custompageradpter = new CustomViewPagerAdapter(this);
         mViewPager.setAdapter(custompageradpter);

    public class CustomViewPagerAdapter  extends PagerAdapter {


        Context mContext;
        LayoutInflater mLayoutInflater;

        int[] mResources = {
                R.drawable.emoji_1,
                R.drawable.emoji_2,
                R.drawable.emoji_3,
                R.drawable.emoji_4,
                R.drawable.emoji_5,
                R.drawable.emoji_6
        };

        public CustomViewPagerAdapter(Context context) {
            mContext = context;
            mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return mResources.length;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

            ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
            imageView.setImageResource(mResources[position]);

            container.addView(itemView);

            return itemView;
        }

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

    }

3)次と前のボタンの場合

         case R.id.img_previous:
                    mViewPager.setCurrentItem(getItemofviewpager(-1), true);
                    break;

                case R.id.img_next:
                    mViewPager.setCurrentItem(getItemofviewpager(+1), true);
                    break;

4)この機能を作成する

  private int getItemofviewpager(int i) {
        return mViewPager.getCurrentItem() + i;
    }
于 2017-08-02T06:37:41.947 に答える
4

sweggersenとAlexOrlov答えへのフェイルプルーフアップグレード、

// For scrolling to next item
nextPageButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        viewPager.setCurrentItem(getNextPossibleItemIndex(1), true);
    }
});

// For scrolling to previous item
previousPageButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        viewPager.setCurrentItem(getNextPossibleItemIndex(-1), true);
    }
});

アクティビティ/フラグメントにgetNextPossibleItemIndex()メソッドを追加します。

private int getNextPossibleItemIndex (int change) {

    int currentIndex = viewPager.getCurrentItem();
    int total = viewPager.getAdapter().getCount();

    if (currIndex + change < 0) {
        return 0;
    }

    return Math.abs((currentIndex + change) % total) ;
}

このようにして、Heinrichのコメントで示唆されているように、 IndexOutOfBoundsExceptionを気にせずにcurrentItemを変更できます。この方法を使用すると、アイテムは循環リストのように表示されることに注意してください。

1 -> 2 -> 3 -> 1 -> 2 -> 3 -> 1

でも戻ってみると、最初のアイテムで止まります

1 <- 1 <- 2 <- 3
于 2018-02-23T10:46:06.007 に答える
4

このようにしてください:

backButton=(Button)findViewById(R.id.back_button);
nextButton=(Button)findViewById(R.id.next_button);
backButton.setVisibility(View.INVISIBLE);//you can use GONE or even disable it. It depends on your layout 


    nextButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()+1, true);
        }
    });


    backButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()-1, true);
        }
    });
}

IndexOutOfBoundsExceptionを防ぐには、次のように2つのボタンを非表示にして表示する必要があります。

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {

        }
        @Override
        public void onPageSelected(int position) {
            if(position==0) {
                backButton.setVisibility(View.INVISIBLE);
            }else  {
                backButton.setVisibility(View.VISIBLE);
            }
            if(position < viewPager.getAdapter().getCount()-1 ) {
                nextButton.setVisibility(View.VISIBLE);
            }else  {
                nextButton.setVisibility(View.INVISIBLE);
            }
        }
        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
于 2019-03-19T13:30:08.520 に答える
3

このコードでこのプロジェクトを終了しました。

vPager = (ViewPager) findViewById(R.id.viewpager);
    View tempView1 = inflater.inflate(R.layout.ani_dialog1, null);
    firstView = (ImageView) tempView1.findViewById(R.id.ani_dialog_next);
    views.add(tempView1);
    firstView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            vPager.setCurrentItem(1, true);

        }
    }); 
于 2012-07-05T06:45:50.063 に答える
1

コードを更新

Button preButton = (Button)findViewById(R.id.pre_button);
        Button nextButton = (Button)findViewById(R.id.next_button);

        preButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mViewPager.setCurrentItem(mViewPager.getCurrentItem()-1, true); 


            }
        });

        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1, true); 

            }
        });
于 2017-04-01T05:19:26.153 に答える
0

最初にインターフェースを作成します

public interface OnPageChangedListener {
void OnPageChanged(int position);      }

次にOnPageChangedListenerインターフェースを使用してアクティビティを実装し、以下のことを行います

private void setupViewPager(ViewPager viewPager){
    viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPagerAdapter.addFragment(new Fragment1(this));
    viewPagerAdapter.addFragment(new Fragment2(this));
    viewPagerAdapter.addFragment(new Fragment3(this));
    viewPagerAdapter.addFragment(new Fragment4(this));
    viewPagerAdapter.addFragment(new Fragment5(this));
    viewPagerAdapter.addFragment(new Fragment6(this));
    viewPager.setAdapter(viewPagerAdapter);
}
@Override
public void OnPageChanged(int position) {
    viewPager.setCurrentItem(position);
}

フラグメントで、を使用してコンストラクターを作成します

private OnPageChangedListener listener;

public Fragment1(OnPageChangedListener listener1) {
    this.listener = listener1;
}

ViewPagerAdapter

public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
    super(manager);
}

@Override
public Fragment getItem(int position) {
    switch (position) {
    }
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

public void addFragment(Fragment fragment) {
    mFragmentList.add(fragment);
}}

これがお役に立てば幸いです

于 2019-05-17T12:39:53.930 に答える
-4
public void onClick(View v) {
     int currentItem = mViewPager.getCurrentItem();
     mViewPager.setCurrentItem(currentItem+1); //(currentItem-1)
}

ボタンクリックでこのコードのみ: @Override

getcurrentitemはの実際のアイテムでviewpager、次のアイテムはcurrentItem + 1

于 2016-10-12T20:21:46.033 に答える