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框架如何处理触摸事件。