0
我有兩個標準的設置,但我希望TabLayout的水龍頭(當用戶直接觸摸TabLayout的點)不同於ViewPager的滑動。也許我只是想要點擊動作來打印「點擊」,滑動動作來打印「滑動」。目前,除了將其附加到ViewPager之外,我沒有在TabLayout上設置任何內容,但是當我在ViewPager上滑動時,它會同時打印「輕掃」和「輕敲」。如何區分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()。 –