7

Używam tablayout z Androidem. Oto mój kod:Centrum Android wyrównaj wybraną zakładkę w 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" 
     /> 

Mój problem to zakładki zawsze wyrównane w lewo. Jednak chciałbym wyśrodkować wybraną zakładkę (nawet na początku pierwsza (wybrana) karta powinna być wyśrodkowana). Czy jest jakiś sposób na zrobienie tego? Dzięki.

+1

Znalazłeś odpowiedź na to? – Mark

+1

Jeśli dostaniesz odpowiedź, proszę nas zaktualizować –

+0

Masz jakieś rozwiązanie tego? –

Odpowiedz

3

Być może szukasz atrybutu xml o nazwie app:tabContentStart. Ten atrybut pozwala popchnąć aktywną kartę po lewej stronie zgodnie z określoną wartością, która jest ustawiona w "dp" (coś w rodzaju marginesowej lewej rzeczy). Na przykład, spróbuj umieścić swój kod tak:

<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. 

To nie dokładnie wycentrować kartę, ale to daje podobny efekt jak zakładek Google w Sklepie Play.

+0

50% odpowiedzi :) – Crowni

8

Przyjrzałem się TabLayout i tabContentStart ustawia tylko dopełnienie dla swojego pierwszego dziecka -> SlidingTabStrip, więc mogę ustawić go ręcznie na obu stronach: najpierw 0 Indeks dziecko

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 za to SlidingTabStrip.

+0

Powoduje to wywołanie metody requestLayout() w nieskończonej pętli. – Shahzeb

+0

Po przełączeniu kart fragmentów przesuwa się w lewo. –

0

Jeśli twój docelowy interfejs API wynosi 23 lub więcej, pozwól mi udostępnić jeszcze jedną opcję do rozważenia wraz z konfiguracją app:tabContentStart zasugerowaną przez SynerFlow, która może pozwolić, aby karta końcowa była wyśrodkowana zamiast przesuwać do lewej krawędzi podczas przewijania . Jednak ja wciąż zastanawianie się podejście do API przed 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); 
    } 
} 
Powiązane problemy