ViewPager中的ScrollView:滑动不起作用

时间:2015-12-13 13:12:04

标签: android android-viewpager android-scrollview

我有一个包含三个片段的ViewPager,其中一个是带有ScrollView的FrameLayout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/table"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"/>
    </ScrollView>

    <Button
        android:id="@+id/buttonRemove"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_button_red"
        android:layout_gravity="bottom"
        android:layout_margin="4dp"
        android:text="@string/button_remove_last_round"
        android:textColor="#ffffff"
        android:textSize="24sp"/>


</FrameLayout>

如果我滑过按钮,它就可以了。但是,如果我滑过ScrollView,它不起作用,只能向上/向下滚动

编辑:我试图覆盖Scrollview的OnTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            touchX = ev.getX();
            touchY = ev.getY();
            return super.onTouchEvent(ev);//if I change it to 'break', then only swipe works, but no scroll
        case MotionEvent.ACTION_MOVE:
            if(Math.abs(touchX-ev.getX())<40){
                return super.onTouchEvent(ev);//Scroll works perfectly
            }else{
                return false;//Scroll disabled, but swipe still not working
            }
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            touchX=0;
            touchY=0;
            break;
    }
    return false;
}

现在我可以禁用滚动,但是滑动仍然无效,如果X点之间的差异超过40,我将事件传递给viewpager,但是viewpager的onTouchListener没有得到此事件;

3 个答案:

答案 0 :(得分:3)

好的,我在@yedidyak的帮助下找到了解决方案。我编写了自定义ScrollView:

import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
import org.apache.spark.mllib.linalg.Vectors

val clusters = KMeansModel.load(sc, "clusters")

clusters.clusterCenters
// Array[org.apache.spark.mllib.linalg.Vector] = Array(
//   [9.099999999999998,9.099999999999998,9.099999999999998],
//   [0.1,0.1,0.1])

clusters.predict(Vectors.dense(Array(0.2, 0.2, 0.2)))
// 1

然后在片段中我将viewpager放到这个视图中,它完美地运行

答案 1 :(得分:1)

问题在于,您不清楚想要发生什么样的滚动,ViewPager的滚动或者滚动视图的滚动。如果你真的需要滚动内部滚动,那么你需要覆盖内部scrollview的OnTouchListener并添加代码来决定何时捕获并使用触摸,以及何时将其传递回父视图。

在这种情况下,您可以执行一些操作来测试滑动是否向上/向下,然后保持触摸,否则如果滑动是侧向然后将其传回。

答案 2 :(得分:0)

  

面向生活在+2019年的未来读者

使用ViewPager2可以避免此问题。 您可以在此topic上找到ViewPager2实现的好例子。