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