2015-09-07 53 views
6

TabLayoutとviewPagerを使用して、ページ間を移動するためにviewPagerを左右にスワイプするオプションがあります。viewPagerのスワイプ方向の変更

私の問題は、私のアプリケーションがRTLベース(右から左)で、スワイプの方向が逆になっていることです。

スワイプの方向をデフォルトから反転版に変更しようとしています。 私はウェブ上でたくさんの検索をしており、それを行う方法を見つけることができませんでした。

私はandroid.support.v4.view.ViewPager;

を使用していますし、これは私がviewPagerと私のTabLayoutを初期化する方法である:

// View Page Adapter 
     final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new PagerAdapter 
       (getSupportFragmentManager(), tabLayout.getTabCount()); 
     //View Page Adapter Configuration 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     viewPager.setOffscreenPageLimit(3); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

概要:私は左にviewPagerをスワイプしていた場合、現在、それは示してい次のページ。 RTLで、viewPagerを右にスワイプすると、次のページが表示されます。

理解しにくいかもしれませんが、ここにあります。私は前のページを表示する権利をスワイプする必要はありながら、右スワイプ は、次のページに

Swiping right shows the next page

を示しています。

+0

これは逆の順序で 'PagerAdapter'の内容を持っているだけの問題ではありませんか? – CommonsWare

+2

setCurrentItemを最後のアイテムに設定するだけではどうですか? – Chris

+0

@CommonsWareそして、左にスワイプするとどうなりますか?このためにonScrollListenerを変更する必要はありませんか? (あなたと同じ答えです。クリス)私はviewPagerのスクロール方向を変更する必要があります(右にスワイプする - 次のページ、左から前のページをスワイプする)。今それは逆転している。私が選択した場合、タブはうまく機能しています。 viewPagerスワイプはしません。 – Eliran

答えて

-1

私はそれが遅いと知っていますが、これは賢明な質問です。 @CommonsWareは、ページアダプタのgetItem()メソッドの項目の順序を逆にすることが問題であると述べています。しかしこれは十分ではありません。 getitem()メソッドで順序を逆にすると、getPageTitle()メソッドで順序を逆にしてはいけません。

public static class AppSectionsPagerAdapter extends FragmentStatePagerAdapter { 
     public AppSectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new page1(); 
       case 1: 
        return new page2(); 
       case 2: 
        return new page3(); 
      } 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "page 3 title"; 
       case 1: 
        return "page 2 title"; 
       case 2: 
        return "page 1 title"; 
       } 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 
    } 

は今や難しい部分です。最大インデックスと現在のインデックスを使用してゼロベースのインデックス順序を逆に変換するこの簡単な方法を使用する必要があります。

public int calculateReverse(int maxIndex,int currentIndex){ 
     return maxIndex-currentIndex; 
    } 

あなたはこのようなonTabSelected()でこのメソッドを使用する必要がありますより:あなたがあなた自身の最大のインデックスを使用する必要がある点に注意してください。

@Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(calculateReverse(2,tab.getPosition())); 
    } 

第二部は、ページアダプタのページリスナーを変更することです。再び最大インデックス番号を使用してください:

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(calculateReverse(2,position)); // reversing the tab selection 
      } 
     }); 

私はできるだけわかりやすいようにしようとしました。これが助けてくれることを願って:)

8

私は同じ問題を月前に直面しましたが、私は素晴らしい解決策を見つけたと思います。 1)XMLでLTRためにあなたのTabLayout方向を変更します。

<android.support.design.widget.TabLayout 
    android:id="@+id/tl_activity_main" 
    android:layout_below="@id/toolbar_activity_main" 
    android:layoutDirection="ltr" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    style="@style/DisionTabLayout" /> 

2)ViewPagerのカスタムアダプタを作成し、メソッドのgetItem(int型の位置)とgetPageTitle(int型の位置)をオーバーライド:

@Override 
public Fragment getItem(int position) { 
    if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) { 
     return mTabs[mTabs.length - position - 1].getFragment(); 
    } else { 
     return mTabs[position].getFragment(); 
    } 
} 

@Override 
public int getCount() { 
    return mTabs.length; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) { 
     return mTabs[mTabs.length - position - 1].getTitle(); 
    } else { 
     return mTabs[position].getTitle(); 
    } 
} 

3)アダプタをViewPagerに設定し、このViewPagerをTabLayoutに適用します。

private void setAdapters() { 
    // initialize adapter 
    mTabsAdapter = new TabsAdapter(getSupportFragmentManager(), mTabs, true); 
    // set adapter to ViewPager 
    vp.setAdapter(mTabsAdapter); 
    // set ViewPager to TabLayout 
    tl.setupWithViewPager(vp); 
    // if RTL orientation, go to last item 
    vp.setCurrentItem(vp.getAdapter().getCount() - 1, false); 
} 

4)私は、より詳細かつ完全なコードが含まれているブログ記事を作成 - here

8

Viewpagerのスワイプ方向を変更するには、非常に単純なtechniqeです。

あなたに従わなければならない2つの簡単なステップ、

1.変更ビューページャの回転、

viewpager.setRotationY(180); 

2.が再度フラグメントの向きを変えるありますビューペイジャーの子であるコンテナ

recyclerView.setRotationY(180); 

注:私の場合は、ビューページャの子としてrecyclerviewを使用しています。

これは100%働いています。

+1

ビューパーヤー内のすべてのビューを逆にします –

+1

レイアウトを1回だけ回転させたのかもしれません。あなたは2度回転する必要があります。子レイアウトよりも一度親レイアウト。間違いなく、正しく動作します。 –

+0

PagerTitleStripのテキストを通常に戻す方法は、ビューを2回回転させるときに期待される動作をします....しかし、ポケットベルのタイトルストリップは、180度回転するとタイトルストリップだけが親ビュー方向に切り替わります – skryshtafovych

関連する問題