Android 无法将ViewPager放入ScrollVIew/NestedScrollView中

Android 无法将ViewPager放入ScrollVIew/NestedScrollView中,android,android-layout,android-viewpager,scrollview,Android,Android Layout,Android Viewpager,Scrollview,我有一个ViewPager,它位于父线性布局中,ViewPager下面有一些按钮。ViewPager工作得很好,直到最近我才将父视图从LinearLayout更改为ScrollView。现在ViewPager消失了。请不要将其标记为垃圾邮件或重复 此外,Playstore上有大量应用程序正在使用此功能。请参阅此应用程序- 我的尝试: setFillViewport(true)-这对我不起作用 将布局高度设置为0dp 使用自定义滚动视图 这些都帮不了我。我正在安卓M上运行这个应用程序 这是my l

我有一个ViewPager,它位于父线性布局中,ViewPager下面有一些按钮。ViewPager工作得很好,直到最近我才将父视图从LinearLayout更改为ScrollView。现在ViewPager消失了。请不要将其标记为垃圾邮件或重复

此外,Playstore上有大量应用程序正在使用此功能。请参阅此应用程序-

我的尝试:

  • setFillViewport(true)-这对我不起作用
  • 将布局高度设置为0dp
  • 使用自定义滚动视图
  • 这些都帮不了我。我正在安卓M上运行这个应用程序

    这是my layout.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context=".activities.HomeActivity">
    
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:onClick="pagerClick"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_gravity="top"
    android:layout_weight="1"
    android:overScrollMode="never"/>
    
    <RelativeLayout
    android:layout_weight="0.8"
    android:layout_marginTop="30dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    .....two buttons
    </RelativeLayout>
    
    </LinearLayout>
    
    </android.support.v4.widget.NestedScrollView>
    
    
    ……两个按钮
    
    问题:


    我怎样才能做到这一点?还有,有没有一个官方的方法

    最好使用recyclerView,并在适配器中添加Viewpager作为其子级。您需要截取recyclerview的触碰,以将滚动显示到ViewPager

    public class TouchInterceptRecyclerView extends RecyclerView {
    
        private boolean interceptTouch = true;
        private static final int MIN_DISTANCE = 200;
        private float downX = 0, downY = 0, moveX = 0, moveY = 0, upX = 0, upY;
    
        public TouchInterceptRecyclerView(Context context) {
            super(context);
        }
    
        public TouchInterceptRecyclerView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (getRvTop() == 0) {
                onTouchEvent(ev);
            }
            return interceptTouch;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    downY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    moveX = event.getX();
                    moveY = event.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    upX = event.getX();
                    upY = event.getY();
                    break;
            }
            float deltaX = upX - downX;
    
            if (getViewTop() == 0 && moveY > downY && Math.abs(moveY - downY) > MIN_DISTANCE) {  // moving down
                interceptTouch = true;
            }else if (Math.abs(deltaX) > MIN_DISTANCE) {
                if (upX > downX) {    // Left to Right swipe action
                    interceptTouch = false;
                }else {    // Right to left swipe action
                    interceptTouch = false;
                }
            } else {  // screen tap
                interceptTouch = false;
            }
            return super.onTouchEvent(event);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            return super.dispatchTouchEvent(ev);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
        }
    
        @Override
        public void onScrolled(int dx, int dy) {
            if (getViewTop() <= 0) {
                interceptTouch = false;            // dispatch the touch to child when reached top
            } else {
                interceptTouch = true;           // do not dispatch the touch event
            }
            super.onScrolled(dx, dy);
        }
    
        public int getViewTop() {
            int top = 0;
            View v = this.getChildAt(1);
            if (v == null) {
                v = this.getChildAt(0);
            }
            if (v != null && v instanceof LinearLayout) {
                top = v.getTop();
            }
            return top;
        }
    
        public int getRvTop() {
            int top = -1;
            View v = this.getChildAt(1);
            if (v == null) {
                v = this.getChildAt(0);
            }
            if (v != null && v instanceof LinearLayout) {
    
                ViewPager vp = (ViewPager) v.findViewById(R.id.single_pager);
                if (vp != null) {
                    int currentPos = vp.getCurrentItem();
                    RecyclerView rv = (RecyclerView) vp.findViewWithTag("recyclerview" + currentPos);
                    if (rv != null) {
                        View v1 = rv.getChildAt(0);
                        if (v1 != null && v1 instanceof CardView) {
                            top = v1.getTop() - ResourceUtils.getDimensionPixelOffset(R.dimen.padding_20);   // deducting 20 as we have give top margin as 20 to the top layout
                        }
                    }
                }
            }
            return top;
        }
    }
    

    我通过调整ViewPager的高度解决了此问题,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context=".activities.HomeActivity">
    
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:onClick="pagerClick"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_gravity="top"/>
    
    ...
    
    </LinearLayout>
    
    </android.support.v4.widget.NestedScrollView>
    
    
    ...
    
    将嵌套的scrollview放入父布局中,例如:CoordinatorLayout这也无助于发布完整的xml。添加了完整的布局。xml感谢您抽出时间回答这个问题。也许我可以使用Recycler视图来完成工作,但是RecyclerView和ScrollView在概念上有区别。我想知道有没有一种方法我们可以一起使用ScrollView和ViewPager?是的,你可以用同样的方法使用ScrollView,只是你需要处理两者的触摸。
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context=".activities.HomeActivity">
    
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:onClick="pagerClick"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_gravity="top"/>
    
    ...
    
    </LinearLayout>
    
    </android.support.v4.widget.NestedScrollView>