2017-08-25 15 views
0

私は2つの間に標準的なセットアップがありますが、TabLayoutのタップ(TabLayoutのドットに直接触れたとき)がViewPagerのスワイプと異なるようにします。たぶん、タップアクションで「タップ」を印刷し、スワイプアクションで「スワイプ」を印刷したいと思うかもしれません。現時点では、TabLayoutでViewPagerにアタッチする以外は何も設定していませんが、ViewPagerをスワイプすると「スワイプ」と「タップ」の両方が印刷されます。TabLayoutとViewPagerのアクションをどのように分けることができますか?

+1

あなたは、 'setupWithViewPagerを()'を使用することはできません。同じことをするためにページをスワイプします。 'TabLayout'のカスタムリスナーを介して、手動でそれをすべて管理する必要があります。 IMHOは、ユーザビリティの観点から、あなたの提案がユーザーの承認を得ることはまずありません。 – CommonsWare

+0

私はそれを最終的に得ましたが、私もsetupWithViewPager()を使用しました。 –

答えて

1

だから私はいくつかの手抜きをしたが、最終的に私が望むものを得た。 TabLayoutのリスナーは、ViewPagerが扱う内容に気をつけますが、逆のことはしません。したがって、VPをスワイプすると、両方のリスナーがそれを聞きます。 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(); 
      }); 
関連する問題