2012-03-16 7 views
17

Używam ActionBarSherlock i mieć pasek akcji z zakładkami nawigacji w nim. Chcę, żeby tabulatory były automatycznie rozmiaru na podstawie rozmiaru tekstu w nich, ale wydaje się, że styl lub ustawienie gdzieś, że zmusza je do korzystania z minimalnej wielkości. Na przykład na zrzucie ekranu zakładka "Very Long Tab" nie ma dopełnienia (zgodnie z zastosowaną stylizacją), ale zakładki oznaczone "T" mają dużo dopełnienia, mimo że ustawiam padding na 0dp.Jak zarządzać szerokością zakładek nawigacyjnych ActionBar?

enter image description here

Jak widać poniżej Próbowałem podejście brute-force, ustawiając różne atrybuty na kilku stylów, ale nie zostały jeszcze udało.

Jak kontrolować dopełnienie/szerokość w zakładkach paska akcji?

<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

utworu: [Jak zrobić Andorid za ActionBar/TabWidget LinearLayout zawinąć to dzieci] [1] [1]: http://stackoverflow.com/questions/28024127/how-to-make- andorids-actionbar-tabwidget-linelayout-to-wrap-its-children/28223519 # 28223519 – Lewapq

Odpowiedz

11

Od tego ekranu strzał wygląda testujesz na ICS, co jest dobre, ponieważ będziesz obserwując zachowanie rodzimej pasku akcji zamiast myśleć, że jest to błąd z ActionBarSherlock.

Zasadniczo pasek akcji będzie próbował rozszerzyć zakładki, aby uzyskać równą ilość miejsca, jeśli jest na to wystarczająco dużo miejsca, aby zapewnić czystszy wygląd, gdy jest tylko kilka zakładek.

Po ustawieniu opcji wyściółki na zero, problem jest jeszcze gorszy, ponieważ tekst w pierwszej zakładce nie zawiera nic, co uniemożliwiłoby jej dotknięcie przekładek i krawędzi ekranu. Jeśli zwiększysz dopełnienie (lub przywrócisz wartość domyślną), zobaczysz jedną z dwóch rzeczy:

  1. Tekst zostanie zawinięty do dwóch linii.
  2. Pasek kart zamienia zakładki po prostu tak szerokie, jak ich zawartość i pozwala na przewijanie w poziomie.

Jestem skłonny sądzić, że ten pierwszy stanie się z powodu bardzo cienkich szerokości drugiej do czwartej zakładki. Niestety jest to po prostu zachowanie paska kart i musimy po prostu spróbować odpowiednio dostosować jego zachowanie.

Jeśli to możliwe, spróbuj utworzyć etykiety tabulacji, które mają bardziej jednolitą szerokość, co prawdopodobnie spowoduje wyzwolenie drugiego stanu wspomnianego powyżej. Kontynuuj testowanie za pomocą usługi ICS, aby upewnić się, że obserwowane zachowanie pochodzi z platformy, a następnie podczas pracy z systemem pre-ICS, należy zachować to samo zachowanie w bibliotece.

+1

Dzięki Jake. Niestety nawet wyrywam wszystkie moje style, zakładki z krótkim tekstem wciąż mają dużo dopełnienia, aw moim scenariuszu dopełnienie powoduje przewijanie kart w poziomie. Na zrzucie ekranu widoczna jest inna karta po prawej stronie, niewidoczna. To jest rzeczywiście problem, aby zatrzymać przewijanie kart, zmniejszając dopełnienie na kartach z krótkimi tytułami tekstowymi. Nie widziałem żadnego zawijania tekstu, ale chcę zmniejszyć dopełnienie, aby nie zawinąć. masz rację, że to jest ICS, na Galaxy Nexus, więc sądzę, że jest to problem natywny, a nie ABS. –

+0

Nie wiem, co powiedzieć niestety. Nie pamiętam wiele z kodu tabulacji ani jej stylów. Wiem tylko, że modyfikuje ona dzieci na podstawie kilku warunków, aby je ułożyć w specjalny sposób. Przepraszam, że nie mogę pomóc. –

1

Wygląda na to, że używasz tylko motywu dla trybu Android 4.0 w ActionBarSherlock?

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

odbite atrybuty

Ze względu na ograniczenia w systemie kategoryzacji Android każdym tematem zmiany muszą być zadeklarowane w dwóch atrybutów. Normalne atrybuty z prefiksem androida mają zastosowanie do natywnego paska działań , a nieprzypisane atrybuty do niestandardowej implementacji. Od oba te interfejsy API są dokładnie takie same, wystarczy tylko dwa razy odwoływać się do swoich dostosowań , zamiast je dwukrotnie implementować.

Najprostszym sposobem przekazania dokładnie tego, co to oznacza, jest przykład . Poniżej znajduje się pełny motyw z „stylizowany” przykład wspomniano powyżej:

<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

unieważnienie tej klasy w projekcie 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 

    } 
} 

oryginalny kod od

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

Po uruchomieniu tego kodu w Android 2.3.3 działa dobrze, gdy moje karty nie są przerywane, ale w Androidzie 4.4 nie działa.