7

Sto usando tablayout di progettazione di supporto Android. Ecco il mio codice:centro android allineare la scheda selezionata in tablaout

<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" 
     /> 

Il mio problema è che le schede sono sempre allineate a sinistra. Tuttavia, vorrei centrare la scheda selezionata (anche all'inizio, la prima scheda (selezionata) dovrebbe essere centrata). C'è un modo per fare questo? Grazie.

+1

Hai trovato una risposta per questo? – Mark

+1

Se si ottiene la risposta, si prega di aggiornarci –

+0

Avete qualche soluzione a questo? –

risposta

3

Forse stai cercando un attributo xml chiamato app:tabContentStart. Questo attributo consente di spostare la scheda attiva a sinistra in base al valore specificato, impostato in "dp" (un po 'come una cosa margin-left). Ad esempio, prova a mettere il codice in questo modo:

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

non esattamente centrare la scheda, ma ti dà un effetto simile a quello delle schede del Google Play Store.

+0

50% della risposta :) – Crowni

8

ho preso uno sguardo in TabLayout e tabContentStart imposta solo il riempimento per il primo figlio -> SlidingTabStrip, quindi ho impostato manualmente su entrambi i lati: il primo figlio 0 indice

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

di TabLayout è lo SlidingTabStrip.

+0

Ciò continua a chiamare requestLayout() in un ciclo infinito. – Shahzeb

+0

Dopo aver cambiato le schede dei frammenti, si sposta a sinistra. –

0

Se l'API di destinazione è 23 o superiore, consentimi di condividere un'altra opzione da considerare insieme alla configurazione di app:tabContentStart suggerita da SynerFlow, che potrebbe consentire di centrare la scheda di estremità invece di scorrere verso il margine sinistro durante lo scorrimento . Comunque, sto ancora cercando di capire l'approccio per l'API prima di 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); 
    } 
} 
Problemi correlati