0

我有一個ViewPager有4頁,頁面將繼續滑動使用可運行和處理程序....每個頁面包含一個ImageView,設置ImageView onClickListener事件在適配器如何使用ViewPager OnTouchListener與ImageView裏面它也有OnClickListener

的ViewPager有OnTouchListener事件而設置初始化

我設置ViewPager OnTouchListener情況下,停止當用戶觸摸viewpager滑動並繼續滑動,當用戶釋放他的手指

這裏我如何設置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; 
     } 
    }); 

而且這是我如何設置ImageView的OnClickListener的ViewPager適配器類中:

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

的原因,您的ImageView從您的ViewPagerMotionEvent回調是因爲你ViewPagerOnTouchListener.onTouch()方法總是返回false。這意味着它不會捕捉陸續View(您ImageView)任何新MotionEvent回調在onTouchEvent()方法返回true。任何View這是「可點擊」對任何MotionEvent返回true,併爲View設置的OnClickListener使得點擊。現在

立即反應可能是爲了讓部分或全部case語句OnTouchListener.onTouch()方法的返回true。但是這會使ViewPager攔截全部MotionEvent回調,或者不會給你所需的功能。

正確的實現方法是子類ViewPager並覆蓋onInterceptTouchEventonTouchEvent方法。關鍵是不要在onTouchEventMotionEvent.ACTION_DOWN的情況下返回true,因爲這將每一個動作委託給ViewPager。相反,如果超過"slop"閾值,您應該攔截MotionEvent回調在MotionEvent.ACTION_MOVE的情況下。這都將連續MotionEvent回調發送到ViewPager.onTouchEvent()方法,而不是任何一個孩子的意見。

Android文檔包含managing touch events的最佳實踐。我也強烈建議看Mastering the Android Touch System,如果你想有一個更好的瞭解Android框架如何處理觸摸事件。