如何区分TabLayout和ViewPager操作?
问题描述:
我有两个标准的设置,但我希望TabLayout的水龙头(当用户直接触摸TabLayout的点)不同于ViewPager的滑动。也许我只是想要点击动作来打印“点击”,滑动动作来打印“滑动”。目前,除了将其附加到ViewPager之外,我没有在TabLayout上设置任何内容,但是当我在ViewPager上滑动时,它会同时打印“轻扫”和“轻敲”。如何区分TabLayout和ViewPager操作?
答
所以它花了一些摆弄,但我终于得到了我想要的。事实证明,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();
});
您将无法使用'setupWithViewPager()',因为它预计标签水龙头和页面滑动来做同样的事情。您需要通过'TabLayout'上的自定义侦听器手动管理。恕我直言,从可用性的角度来看,你提出的建议不太可能满足用户的批准。 – CommonsWare
我最终得到了它,但我也使用了setupWithViewPager()。 –