2012-03-16 7 views
17

Sto usando ActionBarSherlock e ho un ActionBar con le schede di navigazione al suo interno. Voglio che le schede si ridimensionino automaticamente in base alla dimensione del testo al loro interno, ma sembra che ci sia uno stile o un'impostazione da qualche parte che li costringe a utilizzare una dimensione minima. Quindi, ad esempio, nella schermata la scheda "Scheda molto lunga" non ha padding (in base allo stile applicato), ma le schede contrassegnate con "T" hanno una grande quantità di padding, nonostante io abbia impostato il padding su 0dp.Come gestire la larghezza delle schede di navigazione di ActionBar?

enter image description here

Come potete vedere qui sotto ho provato un approccio a forza bruta impostando vari attributi su diversi stili, ma non ho ancora riuscito.

Come controllo il riempimento/larghezza nelle schede della barra delle azioni?

<style 
    name="CustomActivity" 
    parent="@style/Theme.Sherlock" 
    > 
    <item name="actionBarTabStyle">@style/customActionBarTabStyle</item> 
    <item name="actionBarTabBarStyle">@style/customActionBarTabBarStyle</item> 
    <item name="actionBarTabTextStyle">@style/customActionBarTabTextStyle</item> 
</style> 

<style name="customActionBarTabStyle" parent="style/Widget.Sherlock.ActionBar.TabView"> 
    <item name="android:background">@drawable/tab_indicator</item> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 

<style name="customActionBarTabBarStyle" parent="style/Widget.Sherlock.ActionBar.TabBar"> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 

<style name="customActionBarTabTextStyle" parent="style/Widget.Sherlock.ActionBar.TabText"> 
    <item name="android:paddingLeft">0dp</item> 
    <item name="android:paddingRight">0dp</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:minWidth">0dp</item> 
</style> 
+0

cassa: [Come fare di Andorid ActionBar/TabWidget LinearLayout per avvolgere i bambini è] [1] [1]: http://stackoverflow.com/questions/28024127/how-to-make- andorids-actionbar-tabwidget-linearlayout-to-wrap-its-children/28223519 # 28223519 – Lewapq

risposta

11

Da quel schermata sembra che si sta testando su ICS che è buono poiché vi sarà osservando il comportamento della barra delle azioni nativo piuttosto che pensare che sia un bug con ActionBarSherlock.

Fondamentalmente la barra delle azioni tenterà di espandere le schede per occupare lo stesso spazio se c'è spazio sufficiente per fornire un aspetto più pulito quando ci sono solo alcune schede.

Impostando il padding actionBarTabTextStyle a zero si sta effettivamente peggiorando il problema poiché ora il testo nella prima scheda non ha nulla attorno ad esso per evitare che tocchi i divisori e il bordo dello schermo. Se si aumenta l'imbottitura (o tornare a default) si dovrebbe vedere una delle due cose:

  1. Il testo andrà a capo a due linee.
  2. La barra delle schede converte le schede in modo che siano larghe come il loro contenuto e consentano lo scorrimento orizzontale.

Sono propenso a pensare che il primo accadrà a causa delle larghezze molto sottili della seconda alla quarta scheda. Sfortunatamente questo è il modo in cui si comporta la barra delle linguette e dobbiamo semplicemente provare ad accomodare il suo comportamento di conseguenza.

Se possibile, provare a creare etichette di tabulazione con una larghezza unificata che probabilmente innescherà il secondo stato menzionato sopra. Continua a testare con ICS in modo da assicurarti che il comportamento che stai vedendo provenga dalla piattaforma e quindi quando esegui su pre-ICS dovresti ottenere lo stesso comportamento dalla libreria.

+1

Grazie Jake. Sfortunatamente anche io strappo tutti i miei stili, le schede con testo breve hanno ancora una grande quantità di padding, e nel mio scenario il padding sta facendo scorrere le schede orizzontalmente. Nello screenshot c'è in realtà un'altra scheda a destra, non visibile. Questo è in realtà il problema, per impedire lo scorrimento delle schede riducendo il riempimento delle schede con titoli di testo brevi. Non ho visto alcun testo a capo, anche se voglio ridurre il padding non lasciarlo avvolgere. hai ragione che questo è ICS, su un Galaxy Nexus, quindi immagino che questo sia un problema nativo piuttosto che un problema ABS. –

+0

Non so cosa dirti sfortunatamente. Non ricordo gran parte del codice della scheda né dei suoi stili. So solo che modifica i bambini sulla base di alcune condizioni, al fine di disporli in un modo speciale. Mi spiace di non poter essere più di aiuto. –

1

Sembra che tu stia usando il tema per la modalità Android 4.0 di ActionBarSherlock?

Da http://actionbarsherlock.com/theming.html:

specchio Attributi

A causa di limitazioni nel sistema tematizzazione di Android qualsiasi tema personalizzazioni devono essere dichiarate in due attributi. I normali attributi con prefisso Android di applicano il tema alla barra di azione nativa e gli attributi non prefissati sono per l'implementazione personalizzata. Dal entrambe le API di tematizzazione sono esattamente le stesse, è sufficiente fare riferimento alle personalizzazioni due volte anziché doverle implementare due volte.

Il modo più semplice per comunicare esattamente ciò che questo comporta è un esempio di . Il seguente è il tema completo dall'esempio “Styled” di cui sopra:

<style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar"> 
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item> 
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item> 
</style> 

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse"> 
    <item name="background">@drawable/bg_striped</item> 
    <item name="android:background">@drawable/bg_striped</item> 

    <item name="backgroundSplit">@drawable/bg_striped_split</item> 
    <item name="android:backgroundSplit">@drawable/bg_striped_split</item> 
</style> 
1

sostituire questa classe nel progetto ActionBarSherlock ./ActionbarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    Re-measure if we went beyond our maximum size. 
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { 

     //do nothing , override by me for ActionBarTabs not rezize never 

    } 
} 

codice originale da

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    // Re-measure if we went beyond our maximum size. 
    if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { 
     super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), 
       heightMeasureSpec); 
    } 
} 

Quando eseguito, che il codice in Android 2.3.3 funziona bene quando il mio Tab non è rotto, ma in Android 4.4 non funziona.