正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),它本身就是ViewPager中的一个项目。当我在地图上拖动时,如果我的第一个拖动动作在水平轴上,则ViewPager会获取所有拖动事件。如果我在垂直平面上进行第一次拖动动作,则所有后续拖动都将委托给地图控件。我想让GoogleMap捕获所有拖动事件。我添加了一些调试,我看到当我点击地图控件时,当我开始在垂直平面上拖动时,没有onTouch事件甚至进入ViewPager,所以似乎GoogleMap第一次有机会处理事件或把它传下来我在GoogleMap类上找不到任何方法或监听器来告诉它处理所有触摸/移动/拖动事件。
答案 0 :(得分:6)
解决方案是创建一个自定义ViewPager,重写canScroll方法并在我的xml中使用它。 canScroll方法以递归方式传递子视图树,然后决定是否允许View处理水平滚动或是否应由父ViewPager捕获
public class MyViewPager extends ViewPager {
public MyViewPager (Context context) {
super(context);
}
public MyViewPager (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
// Not satisfied with this method of checking...
// working on a more robust solution
if(v.getClass().getName().equals("maps.j.b")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
}
并在你的布局......
<com.myproject.view.MyViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
答案 1 :(得分:3)
我遇到了同样的问题,这个解决方案几乎完成了这个技巧,所以感谢发布它。
我发现的唯一区别是视图类是maps.i.b,所以我用它代替:
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v.getClass().getName().startsWith("maps.")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}