0

あり、その中ImageViewのでViewPager OnTouchListenerを使用する方法初期また、私は、ImageViewのonClickListenerイベントが設定されている4ページを持っているViewPagerは、ページが各ページには、ImageViewのが含まれている.... runableとハンドラを使用してスライド続けるいるOnClickListener

私は、ユーザーがviewpagerに触れたときに、スライドを停止し、ユーザーが自分の指

を離すとスライド継続するViewPager OnTouchListenerイベントを設定していますが、ここにいる間ViewPagerはOnTouchListenerイベントが設定されているアダプタ

でViewPager OnTouchListenerイベントを設定する方法:

BandsViewPager.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        stopSliding = true; 
        bandsHandler.removeCallbacks(animateBandsViewPager); 
        break; 

       case MotionEvent.ACTION_CANCEL: 
        break; 

       case MotionEvent.ACTION_UP: 
        // calls when touch release on ViewPager 
        if (bands != null && bands.size() != 0) { 
         stopSliding = false; 
         bandsRunnable(bands.size()); 
         bandsHandler.postDelayed(animateBandsViewPager, ANIM_VIEWPAGER_DELAY); 
        } 

        break; 

       case MotionEvent.ACTION_MOVE: 
        // calls when ViewPager touch 
        if (bandsHandler != null && stopSliding == false) { 
         stopSliding = true; 
        } 
        break; 
      } 
      return false; 
     } 
    }); 

とここで私はViewPagerアダプタクラス内ImageViewのOnClickListenerを設定する方法である:

mImageView.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      switch(ClickActionType){ 
       case BAND_CLICK_ACTION_BRAND: 
        Categories_Fragment categoriesFrag= new Categories_Fragment(); 
        Bundle categoriesArgs = new Bundle(); 
        categoriesArgs.putInt("BrandId", ClickActionTypeId); 
        categoriesArgs.putInt("TabId", TabId); 
        if (UI.getAppLanguage() == 0) 
         categoriesArgs.putString("BrandName", TitleAr); 
        else 
         categoriesArgs.putString("BrandName", TitleEn); 
        categoriesFrag.setArguments(categoriesArgs); 
        FManager.beginTransaction() 
          .replace(R.id.main_content, categoriesFrag, Categories_Fragment.ARG_ITEM_ID) 
          .addToBackStack(Categories_Fragment.ARG_ITEM_ID) 
          .commit(); 
        break; 

       case BAND_CLICK_ACTION_ITEM: 
        Item_Details_Fragment itemDetailsFrag= new Item_Details_Fragment(); 
        Bundle itemDetailsArgs = new Bundle(); 
        itemDetailsArgs.putInt("ItemId", ClickActionTypeId); 
        itemDetailsFrag.setArguments(itemDetailsArgs); 
        FManager.beginTransaction() 
          .replace(R.id.main_content, itemDetailsFrag, Item_Details_Fragment.ARG_ITEM_ID) 
          .addToBackStack(Item_Details_Fragment.ARG_ITEM_ID) 
          .commit(); 
        break; 
       case BAND_CLICK_ACTION_CATEGORY: 
        Items_Fragment itemsFrag= new Items_Fragment(); 
        Bundle itemsArgs = new Bundle(); 
        itemsArgs.putInt("CategoryId", ClickActionTypeId); 
        if (UI.getAppLanguage() == 0) 
         itemsArgs.putString("CategoryName", TitleAr); 
        else 
         itemsArgs.putString("CategoryName", TitleEn); 
        itemsArgs.putInt("BrandId", 0); 
        itemsArgs.putInt("TabId", TabId); 
        itemsFrag.setArguments(itemsArgs); 
        FManager.beginTransaction() 
          .replace(R.id.main_content, itemsFrag, Items_Fragment.ARG_ITEM_ID) 
          .addToBackStack(Items_Fragment.ARG_ITEM_ID) 
          .commit(); 
        break; 
       default: 
      } 

     } 
    }); 

私はImageViewのOnClickListenerを削除する場合は、ViewPagerは、タッチイベントを受け取ります。

答えて

1

あなたViewPagerOnTouchListener.onTouch()方法は常にfalseを返すためImageViewがあなたのViewPagerからMotionEventコールバックを盗んで、あなたの理由があります。これは、別のView(あなたImageView)の後に任意の新しいMotionEventコールバックonTouchEvent()方法でtrueを返すをキャプチャしないことを意味します。 「クリック可能」である任意のViewはどのMotionEventためtrueを返し、ViewためOnClickListenerを設定することがクリック可能になります。

すぐには、OnTouchListener.onTouch()メソッドがcaseステートメントの一部またはすべてに対してtrueを返すようにすることがあります。しかし、これにより、ViewPagerインターセプトすべてMotionEventコールバックが作成されるか、または必要な機能が提供されません。

をサブクラス化し、onInterceptTouchEventonTouchEventのメソッドをオーバーライドするのが正しい実装です。キーは、これがViewPagerにすべてのジェスチャーを委任されますよう、onTouchEventMotionEvent.ACTION_DOWNの場合trueを返すことはありません。 "slop"しきい値を超えた後にその代わりに、MotionEvent.ACTION_MOVEの場合インターセプトMotionEventコールバックをする必要があります。これにより、子ビューではなく、すべての連続するMotionEventコールバックがViewPager.onTouchEvent()メソッドに送信されます。

Androidのドキュメントはmanaging touch events上のベストプラクティスが含まれています。 Androidフレームワークがタッチイベントをどのように処理するかをよりよく理解したい場合は、Mastering the Android Touch Systemを見ることを強くおすすめします。

関連する問題