7

Я использую дизайн поддержки Android для разработки таблеток. Вот мой код:андроидный центр выровнять выбранную вкладку в tablayout

<android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"" 
     app:tabGravity="center" 
     app:tabMode="scrollable" 
     /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 

Моя проблема заключается в том, что вкладки всегда выравниваются влево. Тем не менее, я хотел бы сосредоточить выбранную вкладку (даже в начале, первая (выбранная) вкладка должна быть центрирована). Есть ли способ сделать это? Благодарю.

+1

Вы нашли ответ на это? – Mark

+1

Если вы ответите, пожалуйста, уточните нас. –

+0

У вас есть решение? –

ответ

3

Возможно, вы ищете атрибут xml под названием app:tabContentStart. Этот атрибут позволяет вам активировать активную вкладку влево в соответствии с указанным значением, которое задано в «dp» (вроде как левая маржа). Например, попытайтесь поместить свой код так:

<android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="scrollable" 
     app:tabContentStart="96dp"/> <-- Or whatever value you want here. 

Это не точно центрировать вкладку, но это дает такой же эффект, как вкладки Play Маркета Google.

+0

50% ответа :) – Crowni

8

Я посмотрел в TabLayout и tabContentStart только устанавливает отступы для своего первого ребенка -> SlidingTabStrip, поэтому я вручную с обеих сторон: первый 0 индекс нижестоящего

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); 
    } 
} 

TabLayout является SlidingTabStrip.

+0

Это вызывает вызов requestLayout() в бесконечном цикле. – Shahzeb

+0

После переключения фрагментов вкладки сдвигаются влево. –

+0

Ужин, спасибо – KZoNE

0

Если ваш целевой API равен 23 или выше, позвольте мне поделиться еще одним вариантом для рассмотрения вместе с конфигурацией app:tabContentStart, предложенной SynerFlow, которая может позволить концу Tab быть центрированной, а не прокручиваться до крайнего левого края во время прокрутки , Тем не менее, я до сих пор выяснить подход к API до 23

final int TAB_CONTENT_START = 96; 

tabLayout.setOnScrollChangeListener(new View.OnScrollChangeListener() { 

    @Override 
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 

     final int maxAllowWidthOfTabBar = tabLayout.getMeasuredWidth() + TAB_CONTENT_START; 
     if (scrollX > maxAllowWidthOfTabBar) 
      tabLayout.setScrollX(maxAllowWidthOfTabBar); 

    } 
}); 
1
public class MyTabLayout extends TabLayout { 

    public MyTabLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setTabMode(MODE_SCROLLABLE); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 
     if (!changed) return; 
     int totalTabsWidth = 0; 
     for (int i = 0; i < getTabCount(); i++) 
      totalTabsWidth += ((ViewGroup) getChildAt(0)).getChildAt(i).getWidth(); 
     int padding = (getWidth() - totalTabsWidth)/2; 
     if (padding < 0) padding = 0; 
     getChildAt(0).setPaddingRelative(padding, 0, padding, 0); 
    } 
} 
Смежные вопросы