36

Próbuję sprawić, aby ActionBar działał poprawnie na mojej aplikacji (i używam ActionBarSherlock, aby uzyskać ujednolicony interfejs między Androidem 2.x i 4.x).showAsAction = "ifRoom" nie wyświetla elementu, nawet jeśli jest dużo miejsca.

Czuję, że android:showAsAction="ifRoom" to tylko duże, grube kłamstwo. Ilekroć ustawiam akcję na ifRoom, ZAWSZE pojawia się w menu przelewu, nawet jeśli jest ZAJECIA miejsca. Oto dwa zrzuty ekranu z tego samego emulatora. Pierwszy pokazuje ActionBar z wszystkimi opcjami ustawionymi na always, a drugi pokazuje ActionBar z dwoma ostatnimi opcjami ustawionymi na ifRoom. Jak widać, ZUPEŁNIE było miejsce w pokoju, kiedy wszystkie zostały pokazane na zrzucie ekranu always, więc dlaczego nie wszystkie są wyświetlane w drugim, ponieważ mają miejsce?

enter image description here

enter image description here

Oto moja menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/add" 
     android:icon="@drawable/ic_menu_btn_add" 
     android:showAsAction="always" 
     android:title="Add"/> 
    <item 
     android:id="@+id/calculateNPV" 
     android:icon="@drawable/menu_icon_npv" 
     android:showAsAction="always" 
     android:title="NPV"/> 
    <item 
     android:id="@+id/calculateIRR" 
     android:icon="@drawable/menu_icon_irr" 
     android:showAsAction="always" 
     android:title="IRR/YR"/> 
    <item 
     android:id="@+id/send" 
     android:icon="@android:drawable/ic_menu_share" 
     android:showAsAction="always" 
     android:title="@string/share_pdf"/> 
    <item 
     android:id="@+id/graph" 
     android:icon="@drawable/ic_menu_gallery" 
     android:showAsAction="ifRoom" 
     android:title="@string/view_cashflow_diagram"/> 
    <item 
     android:id="@+id/deleteReorder" 
     android:icon="@drawable/ic_menu_clear_playlist" 
     android:showAsAction="ifRoom" 
     android:title="@string/delete_reorder_cashflows"/> 

</menu> 

Odpowiedz

11

to dlatego, że nie określono maksymalną liczbę elementów, które powinny iść do actionbar i wydaje się być 4. Z Oczywiście możesz wymusić ich pojawienie się, ustawiając showAsAction: always, ale w odniesieniu do przewodników po Google google:

Jeśli uważasz, że więcej niż cztery pozycje z menu można uzasadnić jako jako elementy akcji, należy dokładnie rozważyć ich względny poziom i spróbuj ustawić nie więcej niż cztery jako elementy działań (i zrób to za pomocą wartość "ifRoom", aby system ponownie umieścił w menu przepełnienia około , gdy przestrzeń jest ograniczona na mniejszych ekranach). Nawet jeśli miejsce jest dostępne na dużym ekranie, nie powinieneś tworzyć długich strumieni akcji, które zakłócają interfejs użytkownika i wyglądają jak pasek narzędzi pulpitu , dlatego należy ograniczyć liczbę elementów akcji do minimum.

Ponadto następujące czynności nigdy nie powinny być wyświetlane jako akcje elementy: ustawienia, pomoc, opinie lub podobne. Zawsze przechowuj je w menu przepełnienia .

+13

Nie zawsze 4. Zobaczmy ten wykres: http://developer.android.com/ design/media/action_bar_pattern_table.png –

+4

Ale jak widzisz, jest miejsce dla tych działań, więc -powoli - jest dużym, grubym kłamstwem. :) To frustrujące, że nie ma widocznego wskaźnika, że ​​jest więcej opcji dostępnych za pomocą przycisku Menu. O wiele gorzej jest pokazać NIEKTÓRE opcje, ale nie wszystkie bez wskaźnika, ponieważ wyświetlenie SOME mówi użytkownikowi, że jest to lokalizacja, której należy szukać. Dlaczego miałaby istnieć inna lokalizacja? –

+1

@Jake Wharton: Tak, tak! Wiedziałem, że widziałem już coś takiego, ale nie mogłem sobie przypomnieć, gdzie. Teraz myślę, że był w jednym z google design w filmach akcji o ActionBar ... Dzięki! –

7

celu uzupełnienia odpowiedź z Michałem Z .: Android Projekt Page próbne-> Actionbar mówi następujących w rozdziale „Przyciski działanie”:

http://developer.android.com/design/patterns/actionbar.html

Jak wiele działań będzie pasować w głównym pasku akcji? pojemność bar działanie jest sterowane za pomocą następujących zasad:

  • przycisków akcji w głównym pasku akcji nie może zajmować więcej niż 50% szerokości baru.
  • Przyciski akcji na dolnych paskach akcji mogą korzystać z całej szerokości.
  • szerokości ekranu w pikselach gęstości niezależne (DP) określić liczbę przedmiotów, które zmieszczą się w głównym pasku akcji:
    • mniejszy niż 360 DP = 2 ikony
    • 360-499 DP = 3 ikony
    • 500-599 DP = 4 ikony
    • 600 DP oraz większe = 5 ikon
31

mam nadzieję, że nie jestem zbyt późno na przyjście na imprezę.

To naprawdę nie jest wielkie kłamstwo, ale małe niedopatrzenie.

Atrybut showAsAction muszą być zdefiniowane przy użyciu innej przestrzeni nazw "http://schemas.android.com/apk/res-auto"

Dlatego należy w górnym znacznikiem menu definiowania nazw następująco xmlns:app="http://schemas.android.com/apk/res-auto"

a następnie używać, aby zdefiniować atrybut showAsAction jak tak app:showAsAction="ifRoom"

to powinno naprawić

+11

Miałem dokładnie ten sam problem - i faktycznie w moim przypadku - musiałem zrobić dokładnie odwrotnie: użyj przestrzeni nazw Android: showAsAction, aby naprawić ten problem. – KurtCobain

+4

Jeśli używasz 'ActionBarActivity', musisz użyć przestrzeni nazw. Używając "Activity" możesz użyć Androida: showAsAction – nickromano

+1

Próbowałem, nie działa dla mnie. Dokumentacja Androida nawet go nie obsługuje. –

2

U se

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
+4

Proszę wyjaśnić swoją odpowiedź, ponieważ odpowiedzi tylko kodu są zwykle niejasne i trudniejsze do zrozumienia. – SuperBiasedMan

+0

nie działa nadal, pokazując tylko menu nie (...) –

3

użycie app:showAsAction="always" zamiast android:showAsAction="always"

0

użytkowania to poniżej kod będzie zawsze działać

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/menu_share" android:title="Share" 
     android:orderInCategory="100" app:showAsAction="ifRoom" 
     android:actionProviderClass="android.widget.ShareActionProvider" /> 
</menu>