ViewPager嵌套在ViewPager(ViewPager nested in ViewPage

2019-07-21 09:56发布

我真的很新受在Android和我将不胜感激我的课程学习任何帮助。

我需要去做:

1)二ViewPagers(未嵌套)在一个活动

2)二ViewPagers(一个ViewPager嵌套在另一个ViewPager)

我发现类似的问题,但我无法使用它。 ViewPager内ViewPager

我想补充第一ViewPager,不知道接下来做什么

LayoutInflater inflater = LayoutInflater.from(this); //this - context of my activity
List<View> pages = new ArrayList<View>();
View page = inflater.inflate(R.layout.activity_main, null);
//next I adding some buttons on page
pages.add(page);

page = inflater.inflate(R.layout.activity_main2, null);  //my second page
//some buttons
pages.add(page);

page = inflater.inflate(R.layout.activity_main3, null);  //my third page
//some buttons
pages.add(page);

SamplePagerAdapter pagerAdapter = new SamplePagerAdapter(pages);
ViewPager viewPager = new ViewPager(this);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(0);          
setContentView(viewPager);

如果我添加ViewPager2说的setContentView(viewPager2),我失去了我的viewPager1。 我花了很多时间这个两个问题,请一些帮助...

//这是我的素描什么,我需要做的。 对不起,我不能将我的scetches ...

Answer 1:

我添加了一个OnTouchListener到内部ViewPager

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(
                event.getAction() == MotionEvent.ACTION_DOWN &&
                v instanceof ViewGroup
        ) {
                ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }
};

这只是检测在内ACTION_DOWN触摸事件ViewPager并防止拦截它的外一个。 因为它返回false,只有ACTION_DOWN事件应被击中; 所有其他事件将被忽略。 您可以将此监听器添加到你想“保护”,从外部的每一个元素ViewPager的滚动,但很明显,如果你想拿起那些元素的任何其他触摸的行为,您需要处理这些触摸监听器里和有可能实现一个更好的倾听者。



Answer 2:

我想你应该重新考虑其另一viewpager内viewpager。 你将有很多问题与触摸事件以及用户的体验可能会造成混乱/棘手,我建议你重新考虑之一。

现在问题1:

声明在活动(/layout/activity.xml),例如xml文件既viewpagers:

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

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

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

</LinearLayout>

然后抬高你的活动和线材两种viewpagers的onCreate方法的XML:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    mViewpager1 = (ViewPager) findViewById(R.id.viewpager1);
    mViewpager2 = (ViewPager) findViewById(R.id.viewpager2);
}

不要忘了声明这两个变量private ViewPager mViewpager1, mViewpager2;

然后,你可以做你想做与mViewpager1和mViewpager2什么。 一个提示,我建议你使用适配器设置页面,而不是由一个一个手动将其添加到每个viewpager的,这将是更清洁,更好地工作。



Answer 3:

关于有嵌套Viewpager和禁用嵌套Viewpager刷卡溶液(如果你想设置的按钮在嵌套所选页面)

对于嵌套子类化ViewPager你添加这些:

 public boolean onInterceptTouchEvent(MotionEvent event) {
        //if you want to send the Touches to this Viewpager (the nested) //change true to false
      return true;    
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages on this inner 

        //send swipe to father instead of child
        if (this.getParent()!=null &&  this.getParent() instanceof ViewPager) {
            ((ViewPager) this.getParent()).onTouchEvent(event);
        }
        return false;
    }

在布局你把这个:

<com.mypackage.mycustomapp.myviews.MyViewPager
            android:id="@+id/myNestedviewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>


文章来源: ViewPager nested in ViewPager