更新: 拡張された質問については報奨金を参照してください。
にGestureDetector
セットアップがありますListView
。ListView は、ウィンドウの側面から来るフラグメント全体であり、別のフラグメントを部分的にオーバーレイします。ユーザーがスワイプして閉じる機能を提供したいと考えています (つまり、Wunderlist は右側のこの機能の好例です)。
これが私のセットアップです:
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
listView.setOnTouchListener(gestureListener);
リスナー自体:
public class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 180;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
FragmentManager fma = getActivity()
.getSupportFragmentManager();
FragmentManager fm = getFragmentManager();
FragmentTransaction t = fm.beginTransaction();
SherlockListFragment mFrag = new RateReviewFragment();
t.add(R.id.main_frag, mFrag);
t.setCustomAnimations(R.anim.animation_enter,
R.anim.animation_leave);
t.remove(mFrag);
t.commit();
}
return false;
} catch (Exception e) {
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// edited out; this opens up a context menu
}
}
場合によってはListView
、一番下までスクロールすると (またはリストの行をクリックしてリストのスクロールが中断された場合)、GestureListener
単純に停止します...リッスンします。スワイプは機能しません。再び機能させるには、スクロールして一番上に戻る必要があります。
誰かがこれらの問題を特定するのを手伝ってくれるなら、私は感謝します!
更新:「リスナーがリッスンを停止する」という問題が1つだけ残っています
更新 2: 何が原因かはわかったかもしれません。修正がわからないだけです:
自分の行動を記録した後、何かを発見しました。リストの下位に行くほど (そして操作するほど)、測定値に一貫性がなくなります。たとえば、リストの一番上で指を左右に 1 cm 動かすと、たとえば 200 ピクセル移動したと表示されます。しかし、私が上記の問題を抱えている場合、同じ1 センチメートルの距離では、はるかに低く、おそらく 50 です。if
私の条件を満たしていないので、ウィンドウは閉じません。
補足: 何度も述べましたが、問題は「リストとやり取りする」ときです。つまり、上から下にすばやくスクロールすると、問題ない; しかし、おそらく画面をタップしたり、スクロールをオンまたはオフにしたり、 のボタンをクリックしたりして、ゆっくりと下に向かって作業するとlistView
、新しいアクティビティが開きます (その後、同じ位置に戻る)。