11

さまざまな子アクティビティを使用してTabActivityを実装しました。

intent = new Intent().setClass(this, MyChildTabActiviy.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = getTabHost.newTabSpec("tag").setIndicator("indicator", getResources().getDrawable(R.drawable.icon)).setContent(intent);
getTabHost.addTab(spec);
...

これまでのところ問題はありませんが、すべてが完全に正常に機能します。多くのチュートリアルで示されているように、プログラムでタブを切り替えたり、タブ内のアクティビティをActivityGroupsに置き換えたりしています。

しかし、私の問題は、フリングジェスチャをチェックしたいときに、gestureDetector.onTouchEvent(event)が常にfalseを返すため、ジェスチャが登録されないことです。

これは私のgestureDetectorの実装です:

public class MyChildTabActiviy extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ... building views, controls, etc.
        GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector());
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
 class MyGestureDetector extends SimpleOnGestureListener {
  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
   if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
    return false;
   // left to right swipe and right to left swipe
   if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
     && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //... fling logic ...
    return true;
   } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
     && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //... fling logic ...
    return true;
   }
   return false;
  }
 }

つまり、このコード(およびフリング検出)は、TabActivityの外部(ランチャーアクティビティなど)でこれらのアクティビティ(4つの基本的なアクティビティがあり、他のアクティビティに切り替えることもあります)を開始すると、完全に正常に機能します。 。しかし、TabActivity内で機能させることはできません。すでにGestureDetectorをTabActivityに追加しようとしましたが、機能しません。いくつかのレイアウトビューやボタン、ViewFlippersなどの特定のビューにGestureDetectorを追加しようとしましたが、機能しません。デバッグしていると、タッチイベントがトリガーされ、モーションが登録されていることがわかりますが、それはフリングやその他のジェスチャとして評価されていません。

だから私の質問は、AndroidのタブでGestureDetectorsの使用に関して何か制限はありますか?私が言ったように、ジェスチャーはTabActivityの外で完全に登録されます。

答えを知っている人の助けをいただければ幸いです。制限がある場合、誰かがその問題の回避策をどのように得ることができますか?

回答ありがとうございます。

4

2 に答える 2

23

ここに記載されている答えを見てください。彼はあなたとほとんど同じことをしましたが、最高評価の回答の最初のコメントを見ると、CdsboyはOnDownを実装してtrueを返すことでそれを機能させました。なぜそれが必要なのかわかりませんが、それは私にとってはうまくいきました。

于 2010-12-11T13:03:11.350 に答える
7

@Abhinavの答え(ところで私も助けてくれました)を補足するものとして、のonDown()デフォルトの実装SimpleOnGestureListenerはを返すことなので、オーバーライドが必要だと思いますfalse。リスナーACTION_DOWNに最初に到達するので、それが何であれ、イベントを破棄します。

于 2010-12-11T16:49:19.613 に答える