2015-01-04 3 views
8

アンドロイドスライドタブレイアウト+ビューページャーには12個のアイテムがあります。選択したタブは、左から右にスライドしながら、プレイストアと同じ中心にする必要があります。どうすればいいのか教えてください。私のアプリケーションでは、アクティブなタブは常に画面の左にあります。アンドロイドでアクティブなタブの中心を合わせる方法スライドタブのレイアウト

enter image description here

enter image description here

+0

、あなたのプロジェクトで[PagerTabStrip](http://developer.android.com/reference/android/support/v4/view/PagerTabStrip.html)を使用しています(つまり、Google Playアプリが使用しているもの)。代わりに通常のタブを使用しているように見えます。 – Marko

+0

いいえ、スライディングタブレイアウト用のサンプルクラスとしてGoogleが提供するSlidingTabLayoutクラスを使用しました。また、私はプレイストアのようなタブのタイトルをスライドさせることはできませんPagerTabStripを試してみました。 SlidingTabLayoutはHorizo​​ntalScrollViewを拡張したものです。 –

+0

私は参照してください。 Androidデベロッパーからこの[video](https://www.youtube.com/watch?v=tRg_eDfQ8fk)を見ると、これは予想された動作ではないことがわかります。 Google Playの効果を得るには、** PagerTabStrip **を使用する必要があります。これは実装が非常に簡単で、チェックアウト[このチュートリアル](http://codetheory.in/android-pagertabstrip-pagertitlestrip-viewpager/)です。 – Marko

答えて

3

Googleがsliding tab layoutのためのサンプルを提供してきました。しかし、SlidingTabLayoutクラスの実装では、選択したタブを中央揃えにするようには設計されていませんでした。スクロール方法を変更して、画面の選択/アクティブなタブの中央にします。ここで、コード変更がある:

クラス名:SlidingTabLayout

行番号:241、scrollToTab {}

更新方法:

private void scrollToTab(int tabIndex, int positionOffset) { 
    final int tabStripChildCount = mTabStrip.getChildCount(); 
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { 
     return; 
    } 

    View selectedChild = mTabStrip.getChildAt(tabIndex); 
    if (selectedChild != null) { 
     int targetScrollX = selectedChild.getLeft() + positionOffset; 

     if (tabIndex > 0 || positionOffset > 0) { 
      // If we're not at the first child and are mid-scroll, make sure we obey the offset 
      targetScrollX -= (getWidth()-selectedChild.getWidth())/2; 
     } 

     scrollTo(targetScrollX, 0); 
    } 
} 
+1

スクロールビューの幅を測定するためにディスプレイを取得する必要はありません。getWidth();)を呼び出します。 –

+0

Yuri Heupa、答えを更新しました。あなたの提案をありがとう。 –

+0

+1それは働いています:)しかし、中央に置く努力の末尾には少しばかげがあります。以下はそれを修正します。 :)しかし、良い仕事。 –

12

私のアプローチはShripad Bhat溶液を少し異なります、スライドの端にあるタブを跳ね返します。ここで

は私の回避策だ...

onPageScrolled方法の変更:scrollToTab方法に

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    int tabStripChildCount = mTabStrip.getChildCount(); 
    if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { 
     return; 
    } 

    mTabStrip.onViewPagerPageChanged(position, positionOffset); 

    View selectedTitle = mTabStrip.getChildAt(position); 
    int selectedOffset = (selectedTitle == null) ? 0 : selectedTitle.getWidth(); 
    int nextTitlePosition = position + 1; 
    View nextTitle = mTabStrip.getChildAt(nextTitlePosition); 
    int nextOffset = (nextTitle == null) ? 0 : nextTitle.getWidth(); 
    int extraOffset = (int)(0.5F * (positionOffset * (float)(selectedOffset + nextOffset))); 
    scrollToTab(position, extraOffset); 

    if (mViewPagerPageChangeListener != null) { 
     mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels); 
    } 
} 

変更:

private int mLastScrollTo; 

private void scrollToTab(int tabIndex, int positionOffset) { 
    final int tabStripChildCount = mTabStrip.getChildCount(); 
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { 
     return; 
    } 

    View selectedChild = mTabStrip.getChildAt(tabIndex); 
    if (selectedChild != null && selectedChild.getMeasuredWidth() != 0) { 

     int targetScrollX = ((positionOffset + selectedChild.getLeft()) - getWidth()/2) + selectedChild.getWidth()/2; 

     if (targetScrollX != mLastScrollTo) { 
      scrollTo(targetScrollX, 0); 
      mLastScrollTo = targetScrollX; 
     } 
    } 
} 
+0

素晴らしい仕事の仲間。それは魅力のように働く:)もし可能ならば+10。 :) –

+0

LGTM、ありがとう! :D –

+3

ありがとう、それは素晴らしいです。しかし、どのように最初のタブ項目を中央に作るのですか? – NickUnuchek

2

もこの問題を抱えていました。 tabLayoutのみtabContentStartオプションを提供し、両面が必要:

public class CenteringTabLayout extends TabLayout { 
public CenteringTabLayout(Context context) { 
    super(context); 
} 

public CenteringTabLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CenteringTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    View firstTab = ((ViewGroup)getChildAt(0)).getChildAt(0); 
    View lastTab = ((ViewGroup)getChildAt(0)).getChildAt(((ViewGroup)getChildAt(0)).getChildCount()-1); 
    ViewCompat.setPaddingRelative(getChildAt(0), (getWidth()/2) - (firstTab.getWidth()/2),0,(getWidth()/2) - (lastTab.getWidth()/2),0); 
} 
} 
+0

あなたのコードはViewCompatを使用している行に例外をスローしています、あなたは本当にしたいことを理解することができるように少しあなたのコードを説明してください。 – EyadMhanna

+0

私はandroid.support.design.widget.TabLayoutを拡張しました。最初の子はSlidingTabStripであり、すべてのタブはその子の1つですが、このSlidingTabStripにパディングを設定しようとしています でも、私の場合でも最後のタブを中心に配置しません。まだ見つけられなかった理由。 –

関連する問題