Java GoogleMap在ViewPager中的一个片段内,将所有触摸事件保留在GoogleMap中

Java GoogleMap在ViewPager中的一个片段内,将所有触摸事件保留在GoogleMap中,java,android,google-maps-android-api-2,Java,Android,Google Maps Android Api 2,正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),该片段本身就是ViewPager中的一个项。当我在地图上拖动时,如果我的第一个拖动运动在水平轴上,ViewPager将获取所有拖动事件。如果在垂直平面上进行第一次拖动,则所有后续拖动都将委托给贴图控件。我想让谷歌地图捕捉所有的拖动事件。我添加了一些调试,我发现当我点击map控件并开始在垂直平面上拖动时,甚至没有任何onTouch事件进入ViewPager,因此Google地图似乎第一次有机会处理事件或传递事件。我在Goog

正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),该片段本身就是ViewPager中的一个项。当我在地图上拖动时,如果我的第一个拖动运动在水平轴上,ViewPager将获取所有拖动事件。如果在垂直平面上进行第一次拖动,则所有后续拖动都将委托给贴图控件。我想让谷歌地图捕捉所有的拖动事件。我添加了一些调试,我发现当我点击map控件并开始在垂直平面上拖动时,甚至没有任何onTouch事件进入ViewPager,因此Google地图似乎第一次有机会处理事件或传递事件。我在GoogleMap类中找不到任何方法或侦听器来告诉它处理所有触摸/移动/拖动事件。

解决方案是创建一个覆盖canScroll方法的自定义ViewPager,并在我的xml中使用它。canScroll方法递归地传递子视图树,然后决定是否允许该视图处理水平滚动,或者是否应由父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" />

我也遇到了同样的问题,这个解决方案几乎成功了,所以感谢您发布它

我发现的唯一区别是视图类是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);
}

似乎地图类名将根据Google Play Services的版本而改变,所以您的答案是+1!