5

タイトルが示すように、ViewPager のアイテムであるフラグメント内に GoogleMap コントロール (API v2) があります。マップ上でドラッグするとき、最初のドラッグ モーションが水平軸上にある場合、ViewPager はすべてのドラッグ イベントを取得します。垂直面で最初のドラッグ モーションを行うと、その後のすべてのドラッグはマップ コントロールに委譲されます。GoogleMap にすべてのドラッグ イベントをキャプチャさせたいと考えています。デバッグを追加したところ、マップ コントロールをタップして垂直面でドラッグを開始したときに、onTouch イベントが ViewPager に到達しないことがわかりました。そのため、GoogleMap がイベントを処理する最初の機会を取得するか、それを渡します。GoogleMap クラスに、すべてのタッチ/移動/ドラッグ イベントを処理するように指示するメソッドまたはリスナーが見つかりません。

4

2 に答える 2

6

解決策は、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" />
于 2013-01-17T21:37:23.113 に答える
3

私は同じ問題を抱えていましたが、この解決策はほとんどうまくいきました。投稿してくれてありがとう。

私が見つけた唯一の違いは、ビュー クラスが maps.ib だったので、代わりにこれを使用したことです。

@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);
}
于 2013-03-15T20:37:33.470 に答える