2017-08-25 71 views
0

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

+1

您將無法使用'setupWithViewPager()',因爲它預計標籤水龍頭和頁面滑動來做同樣的事情。您需要通過'TabLayout'上的自定義偵聽器手動管理。恕我直言,從可用性的角度來看,你提出的建議不太可能滿足用戶的批准。 – CommonsWare

+0

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

回答

1

所以它花了一些擺弄,但我終於得到了我想要的。事實證明,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(); 
      }); 
相關問題