2012-04-11 23 views
9

Ich habe eine mit einer Aktionsleiste von ActionBarSherlock. Die Aktionsleiste ist sowohl geteilt (auf "schmalen" Bildschirmen) als auch überlagert/halbtransparent (Android: windowActionBarOverlay ist wahr). Mehr oder weniger wie die Google Maps App.Ermitteln, ob Aktionsleiste geteilt ist

Jetzt möchte ich Ansichten oben auf der Karte verschieben, am unteren Rand des Bildschirms immer noch über der unteren Aktionsleiste. Mein Problem hier ist, dass ich die Höhe der unteren Aktionsleiste nicht kenne. Ehrlich gesagt, ich kann nicht einmal einen Weg finden zu wissen, ob es gezeichnet ist oder nicht. getHeight() scheint die Höhe der oberen Aktionsleiste zurückzugeben (oder vielleicht ist es die Höhe von beiden, aber ich weiß immer noch nicht, ob die untere Aktionsleiste existiert oder nicht.

Bitte sagen Sie mir, dass diese Information richtig ist vor meinen Augen!

Antwort

2

der untere Balken sollte die Höhe der regelmäßigen Aktionsleiste anzeigen lassen. Somit sollte ?android:attr/actionBarSize (oder in ActionBarSherlock Fall ?attr/actionBarSize) für die Höhe in XML oder getResources().getDimensionPixelSize(R.attr.actionBarSize) in Code genügen.

bearbeiten:

Äh, bei einem zweiten Lesen Ihrer Frage scheint es sich mehr darauf zu konzentrieren, ob der geteilte Aktionsbalken existiert oder nicht.

Möglicherweise möchten Sie diese Antworten und die nachfolgende Kommentare von Adam Powell, Aktionsleiste Guru lesen:

+0

Ja, ich muss auch wissen, ob es überhaupt existiert. Jedenfalls wurde mir (von Roman glaube ich) zu Android Office Hours gesagt, dass dies einfach nicht möglich sei. Zumindest nicht auf eine einfache und direkte Art und Weise. Daher experimentieren wir jetzt mit einer einzelnen oberen Aktionsleiste und ahmen stattdessen die untere Aktionsleiste mit einer regulären Ansicht nach. Dies löst nicht nur dieses Problem, sondern auch ein anderes, bei dem wir einige Aktionen auf die oberste Aktionsleiste "erzwingen" wollten. – pakerfeldt

3

Ich lief in das gleiche Problem. Auf Telefongeräten im Hochformat ist die Aktionsleiste geteilt. So befinden sich Menüpunkte in der oberen Aktionsleiste und die Tabs in einer zweiten Aktionsleiste (Tableiste) darunter. Ich habe einfach keine Möglichkeit gefunden, die Höhe der Aktionsleiste zu bestimmen: um zu sehen, welcher Platz auf dem Bildschirm übrig ist, bevor ich meinen Bildschirm erstelle.

Also habe ich eine Annahme:

  • auf kleine und normalen Bildschirmgröße Geräten die ActionBar im Portrait-Modus aufgespalten wird
  • auf große Bildschirmgröße Geräten (wie Nexus 7) die ActionBar auch im Portrait-Modus aufgespalten wird
  • auf xlarge Bildschirmgröße Geräte (Tabletten) die ActionBar nicht
  • im Portrait-Modus aufgespalten wird

So unterscheiden ich die verschiedenen Bildschirmgrößen und erstellt eine Bool Ressource

<!-- res/values/booleans.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_split_actionbar">false</bool> 
</resources> 

<!-- res/values-small-port/booleans.xml 
    res/values-normal-port/booleans.xml 
    res/values-large-port/booleans.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_split_actionbar">true</bool> 
</resources> 

Im Code greife ich auf den Wert wie folgt aus:

Boolean isSplit = getResources().getBoolean(R.bool.is_split_actionbar); 

Um die ActionBar Höhe im onCreateView get() Methode:

TypedValue typedVal = new TypedValue(); 
getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, typedVal, true); // use android.R when not using ABS 
int actionBarHeight = getResources().getDimensionPixelSize(typedVal.resourceId); 

Und die doppelte Höhe, wenn die ActionBar ist aufgeteilt:

if(isSplit) 
    actionBarHeight = actionBarHeight * 2; 

Es ist keine ideale Lösung, aber für mich funktioniert das.

+0

Nächste Antwort auf eine Lösung. –

+2

Es scheint mir, dass diese Annahme auf einer falschen Prämisse basiert: meine Aktionsleiste spaltet sich auf einem Nexus 4, aber nicht auf einem Nexus 7. –

+0

Es ist nicht auf Nexus 7 API 25 Android Studio Emulator aufgeteilt. – isabsent

5

Wenn Sie ActionBarSherlock verwenden Sie können für den Booleschen Wert aussehen abs__split_action_bar_is_narrow

einfach einige statische Methode erstellen, in dem Sie tun können

return ResourcesCompat.getResources_getBoolean(context, 
          R.bool.abs__split_action_bar_is_narrow); 

Sie die ResourcesCompat verwenden müssen (von ActionBarSherlock) Klasse, weil pre 3.2 kann Ordner mit Metriken nicht lesen (wie Werte-sw480)

+0

Funktioniert das noch in API 3.1 +? wenn ActionBarSherlock tatsächlich die native Aktionsleiste verwendet? –

+0

@CarlosP Ja, es funktionierte auf einem Galaxy Nexus 4.2.2 –

+0

Danke für Ihre Rückmeldung, zu schätzen - hoffentlich wird anderen Benutzern helfen. –

Verwandte Themen