Android ViewPager嵌套滑动问题解决

ViewPager中间嵌套ViewPager时,默认事件会被内部ViewPager拦截,当滑动到最左边或者最右边时,会被外部ViewPager接收,如下图所示:


默认截图

现项目有一需求,要求内部ViewPager使用手动切换,左右滑动事件由外部ViewPager接收,待实现效果如下图所示:


内部ViewPager禁止滑动的截图
解决方案

自定义内部ViewPager,拦截内部滑动事件,重写canScrollHorizontally即可,直接返回false。

public class NoScrollViewPager extends ViewPager {
    public NoScrollViewPager(@NonNull Context context) {
        super(context);
    }

    public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }
}

引用代码,布局全部使用java实现

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ViewPager contentView=new ViewPager(this);
        setContentView(contentView);
        final List<View> views = new ArrayList<>();
        TextView view = new TextView(this);
        ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
        view.setLayoutParams(params);
        //数据填充
        view.setText("我是第一个TextView");
        view.setGravity(Gravity.CENTER);
        views.add(view);
        final ViewPager viewPager=new NoScrollViewPager(this);
        viewPager.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return 2;
            }

            @Override
            public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
                return view == o;
            }
            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, final int position) {
                TextView view = new TextView(MainActivity.this);
                ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
                view.setLayoutParams(params);
                //数据填充
                view.setText("我是第二个ViewPager——position:"+position);
                view.setGravity(Gravity.CENTER);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        viewPager.setCurrentItem(position==0?1:0);
                    }
                });
                container.addView(view);
                return view;
            }

            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                container.removeView((View) object);
            }
        });
        views.add(viewPager);
        PagerAdapter adapter = new PagerAdapter() {
            @Override
            public int getCount() {
                return views.size();
            }

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

            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                View view = views.get(position);
                container.addView(view);
                return view;
            }

            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                container.removeView((View) object);
            }
        };
        contentView.setAdapter(adapter);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,523评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,971评论 2 59
  • 上一篇文章我们讲述了Android View事件分发机制。如果你对View的事件分发还不熟悉,建议先去看一下 一文...
    Flyzend阅读 30,571评论 30 184
  • Android 事件分发和滑动冲突都是开发中经常遇到的难点问题,遇到问题时可能会通过 Google 或者 Stac...
    任教主来也阅读 2,721评论 0 24
  • 欢迎来到实验中学初二一班的播报空间。我是今天的播报员王智豪。我今天为大家推荐的一本书是《昆虫记》作者是法国作家法布...
    欣怡然阅读 2,140评论 0 0