如何区分TabLayout和ViewPager操作?

问题描述:

我有两个标准的设置,但我希望TabLayout的水龙头(当用户直接触摸TabLayout的点)不同于ViewPager的滑动。也许我只是想要点击动作来打印“点击”,滑动动作来打印“滑动”。目前,除了将其附加到ViewPager之外,我没有在TabLayout上设置任何内容,但是当我在ViewPager上滑动时,它会同时打印“轻扫”和“轻敲”。如何区分TabLayout和ViewPager操作?

+1

您将无法使用'setupWithViewPager()',因为它预计标签水龙头和页面滑动来做同样的事情。您需要通过'TabLayout'上的自定义侦听器手动管理。恕我直言,从可用性的角度来看,你提出的建议不太可能满足用户的批准。 – CommonsWare

+0

我最终得到了它,但我也使用了setupWithViewPager()。 –

所以它花了一些摆弄,但我终于得到了我想要的。事实证明,TabLayout的听众关心的是ViewPager处理的内容,而不是其他方式。所以当副总裁被sw掉时,两位听众都会听到。当轻击TabLayout时,只有TabLayout知道。因此,我可以设置水龙头功能来完成它的水龙头功能,然后在滑动功能中,我只需确保它能够确定它是否是实际移动VP的轻扫或水龙头。

MVVM ViewModel的绑定:

@BindingAdapter({"onAdapterChangeListener"}) 
public static void setOnAdapterChangeListener(ViewPager viewPager, BehaviorSubject<Void> adapterChangeSubject) { 
    viewPager.addOnAdapterChangeListener((viewPager1, oldAdapter, newAdapter) -> adapterChangeSubject.onNext(null)); 
} 

@BindingAdapter({"viewPager","onTap","onSwipe"}) 
public static void addOnTabSelectedListener(TabLayout tabLayout, ViewPager viewPager, BehaviorSubject<Integer> tapSubject, BehaviorSubject<Integer> swipeSubject) { 
    viewPager.addOnAdapterChangeListener((viewPager1, oldAdapter, newAdapter) -> { 
     tabLayout.setupWithViewPager(viewPager); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       int tabPosition = tab.getPosition(); 
       if (tabPosition == viewPager.getCurrentItem()) { 
        swipeSubject.onNext(tabPosition); 
        // A swipe will have the VP tell the TabLayout what tab to move to before 
        // this is called, so if the two positions match, it means the user 
        // performed a swipe action 
       } else { 
        tapSubject.onNext(tabPosition); 
        viewPager.setCurrentItem(tabPosition); 
        // Otherwise, it was definitely a tap action 
       } 
      } 
      // If I updated from API 23 to 24 I would use tabLayout.addOnTab and wouldn't 
      // need these guys below 
      @Override 
      public void onTabUnselected(TabLayout.Tab tab) {} 
      @Override 
      public void onTabReselected(TabLayout.Tab tab) {} 
     }); 
    }); 
} 

XML:

<android.support.design.widget.TabLayout 
     android:id="@+id/tab_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="-17dp" 
     android:layout_gravity="top" 
     app:tabBackground="@drawable/dot_tab_selector" 
     app:tabGravity="center" 
     app:tabIndicatorHeight="0dp" 
     app:tabPaddingEnd="5dp" 
     app:tabPaddingStart="5dp" 
     app:viewPager="@{{viewPager}}" 
     app:onTap="@{carouselViewModel.tapSubject}" 
     app:onSwipe="@{carouselViewModel.swipeSubject}"/> 

    <com.snip.CustomViewPager 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clipToPadding="false" 
     android:paddingEnd="20dp" 
     android:paddingStart="20dp" 
     app:onAdapterChangeListener="@{carouselViewModel.carouselAdapterChangeSubject}"/> 

CarouselViewModel:

swipeSubject 
      .subscribe(page -> { 
       doTheSwipeThing(); 
      }); 

    tapSubject 
      .subscribe(page -> { 
        doTheTapThing(); 
      });