【问题标题】:Android ViewPager Prev/Next ButtonAndroid ViewPager 上一个/下一个按钮
【发布时间】:2012-06-06 20:10:02
【问题描述】:

好的,我正在开发一个使用 ViewPager 来显示页面的 Android 应用。

在每个页面中,我都有一组按钮用于在页面之间导航(除了在页面之间滑动)。这些按钮用于“第一页”、“上一页”、“下一页”和“最后一页”。

我不知道该怎么做是设计一种机制来启用按钮单击时的页面更改。

有人有什么想法吗?

ETA:为了更好地解释设置,按钮在每个页面的布局中声明,并与 PagerAdapter 中的其余布局一起扩展。我的问题是我无法从 PagerAdapter 中引用 ViewPager。或者至少,我想不出办法。

【问题讨论】:

  • 我有同样的问题(不知道如何从 PagerAdapter 中引用 ViewPager),并且 Accepted 的答案也没有回答(只使用 mViewPager 而不指定它是什么)。那么你是如何让它发挥作用的呢?
  • 好吧。那是四年前的事了,我手头没有代码。甚至不再为公司工作。
  • 但我想我做了一些事情,比如将 mViewPager 作为类变量而不是本地变量。我将项目的这一部分基于 2.5 示例项目之一,因此您可能会找到类似的帮助。自从这样做后,我升级了项目以使用 4.0 版本的东西,我记得这完全不同。

标签: android button navigation android-viewpager


【解决方案1】:

按钮:

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;
}

希望这会有所帮助:)

【讨论】:

  • 这将抛出IndexOutOfBoundsExceptions,因为没有检查当前位置。
  • 这会带来一些问题,你必须给 viewPager.getCurrentItem() + 1 和 viewPager.getCurrentItem() - 1 而不是 1 和 -1 给下一个和上一个片段
【解决方案2】:
yourButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
      yourViewPager.setCurrentItem(page, smoothScroll);
   }
});

【讨论】:

  • 我确实调查过,这是我最初的想法。但是按钮是在布局中声明的,这些布局在适配器内部膨胀,无法引用 ViewPager 对象本身......
  • 然后创建一个自定义适配器并将viewPager作为变量传递?或者更好的是传递一个自定义事件监听器。
  • 什么是page和smoothScroll?
  • page 是 yourViewPager.getCurrentItem+-1,smoothScroll 是 true。
  • @DennisJaamann 您能在回答中告诉我如何做到这一点或提供链接吗?我是菜鸟
【解决方案3】:

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;
    }

【讨论】:

  • 不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释
【解决方案4】:

sweggersen'sAlex Orlov's 答案的防故障升级,

// 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);
    }
});

在您的 Activity/Fragment 中添加 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) ;
}

这样,您将能够更改 currentItem 而无需担心 IndexOutOfBoundsException as suggested by Heinrich's comment。请注意,使用此方法,项目将显示为圆形列表。

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

但是回过头来,它会停在第一个项目

1 <- 1 <- 2 <- 3

【讨论】:

    【解决方案5】:

    这样做:

    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 你应该像这样隐藏和显示两个按钮:

        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) {
    
            }
        });
    

    【讨论】:

    • viewPager.getAdapter().getCount() 在 vi​​ewpager2 中无法解析?
    【解决方案6】:

    我用这段代码完成了这个项目。

    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);
    
            }
        }); 
    

    【讨论】:

    • 为什么总是第 1 项?很好,您在代码中保留了“// TODO 自动生成的方法存根”
    • 这将抛出IndexOutOfBoundsExceptions,因为没有检查当前位置。
    【解决方案7】:

    更新代码

    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); 
    
                }
            });
    

    【讨论】:

      【解决方案8】:

      首先创建一个接口

      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);
      }}
      

      希望对你有帮助

      【讨论】:

        【解决方案9】:
        public void onClick(View v) {
             int currentItem = mViewPager.getCurrentItem();
             mViewPager.setCurrentItem(currentItem+1); //(currentItem-1)
        }
        

        只有这个代码在按钮点击: @Override

        getcurrentitemviewpager中的实际项,下一项是currentItem + 1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-23
          • 1970-01-01
          • 2018-03-20
          • 1970-01-01
          • 1970-01-01
          • 2020-05-30
          • 2013-12-14
          • 2017-01-11
          相关资源
          最近更新 更多