23

Niedawno opracowałem aplikację na Androida, w której muszę mieć niestandardowy układ i wymiar paska zakładek. Sposób, w jaki robiłem to do tej pory, to wykorzystanie biblioteki ActionBarSherlock autorstwa Jake'a Whartona do obsługi wersji wcześniejszych HoneyComb dla Androida oraz zastosowanie stylu do aplikacji, w której edytuję element stylu actionBarSize.Zmiana wysokości paska czynności na Androidzie JellyBean

Teraz testowałem aplikację na Galaxy S3 (z Jellybean na niej), a wysokość paska kart nie zmienia się już zgodnie z wartością actionBarSize.

Więc zacząłem pominie kodu Jellybean, a znalazłem tę metodę w klasie ActionBarPolicy:

public int getTabContainerHeight() { 
      TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, 
       com.android.internal.R.attr.actionBarStyle, 0); 
      int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 
      Resources r = mContext.getResources(); 
      if (!hasEmbeddedTabs()) { 
       // Stacked tabs; limit the height 
       height = Math.min(height, 
         r.getDimensionPixelSize(R.dimen.action_bar_stacked_max_height)); 
      } 
      a.recycle(); 
      return height; 
    } 

Z czego wnoszę w tej metodzie, wydaje się, że Jellybean ogranicza wysokość umieszczenie zakładek, gdy aplikacja działa w trybie portretu, ustawiając wysokość paska kart na wartość wymiaru "action_bar_stacked_max_height" (czyli 48 pz, w pliku 4.4.1), mimo że ustawiłem wysokość paska akcji w actionBarSize.

Próbowałem przesłonić tę wartość wymiaru, ustawiając ją na moją własną wartość w moim własnym pliku dimen.xml, ale nie miałem szczęścia. To nie zadziałało.

Moje pytanie:

Czy znacie jakiś sposób, w który mogę nadpisania „action_bar_stacked_max_height” wartość DIMEN?

Z góry dziękuję!

+0

Mam również ten sam problem. Czy znalazłeś jakieś rozwiązanie? – user936414

Odpowiedz

1

wydaje mi się, że to było zrobione celowo i nie wiem dlaczego. Istnieją pewne zmienne w bools.xml

<bool name="action_bar_embed_tabs">true</bool> 
<bool name="action_bar_embed_tabs_pre_jb">false</bool> 

Wysokość kartach embed jest ograniczona do 48dip w ActionBarPolicy.java, jak już wspomniano. Właśnie dlatego takie zachowanie można zobaczyć tylko w Androidzie JellyBean lub nowszym. Nie mogę znaleźć lepszego rozwiązania niż zrobić odbicie w Javie. Więc tutaj jest kod

private void hackJBPolicy() { 
    View container = findScrollingTabContainer(); 
    if (container == null) return; 

    try { 
     int height = getResources().getDimensionPixelSize(R.dimen.action_bar_height); 
     Method method = container.getClass() 
       .getDeclaredMethod("setContentHeight", Integer.TYPE); 
     method.invoke(container, height); 
    } catch (NoSuchMethodException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalArgumentException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (InvocationTargetException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } 
} 

private View findScrollingTabContainer() { 
    View decor = getWindow().getDecorView(); 
    int containerId = getResources().getIdentifier("action_bar_container", "id", "android"); 

    // check if appcompat library is used 
    if (containerId == 0) { 
     containerId = R.id.action_bar_container; 
    } 

    FrameLayout container = (FrameLayout) decor.findViewById(containerId); 

    for (int i = 0; i < container.getChildCount(); i++) { 
     View scrolling = container.getChildAt(container.getChildCount() - 1); 
     String simpleName = scrolling.getClass().getSimpleName(); 
     if (simpleName.equals("ScrollingTabContainerView")) return scrolling; 
    } 

    return null; 
} 

Zastosowanie metody hackJBPolicy() w onCreate. Zauważ, że użyłem ActionBar z biblioteki appcompat. Oto link do przykładowego projektu przy użyciu tego obejścia.

W końcu wydaje mi się, że łatwiej będzie w przyszłości stworzyć niestandardowy widok wyrównany do górnej części ekranu, zamiast używać ActionBar w trybie kart, jeśli projekt interfejsu użytkownika jest nieco oddalony od linii pomocniczych.

+0

Czy możesz wyjaśnić, jak zaimplementować to za pomocą standardowego paska akcji, a nie wsparcia biblioteka? Nie mogę znaleźć zasobu o nazwie R.id.action_bar_container. – user2302510

+0

Wiem, że to bardzo spóźniony komentarz, ale przyjmuję odpowiedź st_, nawet jeśli używa refleksji (która teoretycznie spowalnia aplikację). Dostarcza jednak wystarczających informacji, aby można było zhakować się poza "politykę JB". W końcu opracowałem swój własny pasek zakładek, jak st_ powiedział. – edy

26

Spróbuj umieścić android:actionBarSize i actionBarSize z tematu, którego używasz, tak:

<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
     <item name="android:actionBarSize">55dp</item> 
     <item name="actionBarSize">55dp</item> 
</style> 
+6

To nie działa na JellyBean. – Tomik

+1

To działa na Jellybean. Potwierdziłem to na moim Nexusie 4 – Anton

+4

Cóż, zmienia wysokość głównego paska akcji, ale nie ma wpływu na wysokość paska kart (zdecydowanie nie na Androida 4.2.2). – Tomik

9

Spróbuj użyć android:height jak następuje:

<style name="AppActionBar"> 
    <item name="android:height">50dp</item> 
</style> 

<style name="MainActivityStyle" parent="@android:style/Theme.Holo"> 
    <item name="android:actionBarStyle">@style/AppActionBar</item> 
</style> 
+1

działa dla podzielonego paska akcji, ale nie dla drugiego wiersza/ułożonego słupka (tabulatory) – jfcartier

Powiązane problemy