23

Ich habe vor kurzem eine Android-App entwickelt, in der ich ein benutzerdefiniertes Layout und Dimension für die Tab-Leiste haben muss. Die Art und Weise, wie ich es bis jetzt gemacht habe, besteht darin, die ActionBarSherlock-Bibliothek von Jake Wharton zu verwenden, um Versionen vor HoneyComb Android zu unterstützen, und einen Stil auf die App anzuwenden, in dem ich das actionBarSize-Stilelement bearbeite.Ändern Actionbar Höhe auf Android JellyBean

Jetzt habe ich die App auf dem Galaxy S3 (mit Jellybean darauf) getestet, und die Höhe der Tab Bar ändert sich nicht mehr nach dem actionBarSize Wert. JellyBean Code der Suche durch, und ich fand diese Methode in der ActionBarPolicy Klasse

Also habe ich begonnen:

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

Von dem, was ich in diesem Verfahren sammeln, scheint es, dass JellyBean die Höhe des TabBar begrenzt, Wenn sich die App im Hochformat befindet, indem Sie die Höhe der Tab-Leiste auf den Dimensionswert "action_bar_stacked_max_height" setzen (48dp, in der Datei /values/dimen.xml von 4.1), obwohl ich die Höhe der Aktionsleiste unter actionBarSize eingestellt habe.

Ich habe versucht, diesen Dimensionswert zu überschreiben, indem ich ihn auf meinen eigenen Wert in meiner eigenen dimen.xml Datei setzte, aber ich hatte kein Glück. Es hat nicht funktioniert.

Meine Frage:

Wissen Sie Jungs eine Art und Weise, in der ich den „action_bar_stacked_max_height“ Dimen Wert außer Kraft setzen kann?

Vielen Dank im Voraus!

+0

Ich habe auch das gleiche Problem. Gibt es eine Lösung dafür? – user936414

Antwort

1

scheint es mir, dass es absichtlich getan wurde und ich weiß nicht warum. Es gibt einige Variablen in bools.xml

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

Die Höhe einbetten Tabs begrenzt in ActionBarPolicy.java 48dip, wie Sie bereits erwähnt haben. Deshalb kann solches Verhalten nur in Android JellyBean oder höher gesehen werden. Ich kann keine bessere Lösung finden als eine Java-Reflektion. So, hier ist der Code

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

Verwenden Sie die Methode hackJBPolicy() in Ihrem onCreate. Beachten Sie, dass ich ActionBar aus der appcompat-Bibliothek verwendet habe. Hier ist die link zu dem Beispielprojekt mit der Verwendung dieser Problemumgehung.

Schließlich scheint es mir, dass es in Zukunft einfacher wäre, eine benutzerdefinierte Ansicht am oberen Bildschirmrand zu erstellen, anstatt ActionBar im Tabs-Modus zu verwenden, wenn Ihr UI-Design ein bisschen weit von den Richtlinien entfernt ist.

+0

Können Sie bitte erklären, wie das mit Standard-Action-Bar, nicht aus dem Support zu implementieren Bibliothek? Ich kann die Ressource mit dem Namen R.id.action_bar_container nicht finden. – user2302510

+0

Ich weiß, dass dies ein sehr später Kommentar ist, aber ich werde die Antwort von st_ akzeptieren, obwohl es Reflektion verwendet (was die App theoretisch etwas verlangsamt). Aber er liefert genügend Informationen, um sich an der "JB-Politik" vorbeizuhacken. Am Ende entwickelte ich meine eigene benutzerdefinierte Tab-Leiste, wie gesagt. – edy

26

Versuchen android:actionBarSize und actionBarSize unter dem Thema setzen Sie verwenden, etwa so:

<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

Dies funktioniert nicht auf JellyBean. – Tomik

+1

Dies funktioniert auf Jellybean. Ich habe es auf meinem Nexus 4 bestätigt – Anton

+4

Nun, es ändert sich die Höhe der Hauptaktionsleiste, aber es hat keinen Einfluss auf die Höhe der Tab-Leiste (definitiv nicht auf Android 4.2.2). – Tomik

9

Versuchen android:height wie folgt verwendet:

<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

funktioniert für die Split-Action-Bar, aber nicht für die zweite Zeile/Stack bar (Tabs) – jfcartier

Verwandte Themen