it-swarm.com.ru

showAsAction = "ifRoom" не показывает элемент, даже когда есть много места

Я пытаюсь заставить ActionBar правильно работать в моем приложении (и я использую ActionBarSherlock, чтобы получить унифицированный интерфейс между Android 2.x и 4.x). 

Я чувствую, что Android:showAsAction="ifRoom" просто большая, толстая ложь. Всякий раз, когда я устанавливаю действие на ifRoom, оно ВСЕГДА появляется в меню переполнения, даже если есть МНОГО места. Вот два скриншота из одного и того же эмулятора. Первый показывает ActionBar со всеми опциями, установленными на always, а второй показывает ActionBar с последними двумя опциями, установленными на ifRoom. Как вы можете видеть, было много места, когда все они были показаны на скриншоте always, так почему же они не отображаются во втором, потому что у них действительно есть место?

enter image description here

enter image description here

Вот мой 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>
43
Kenny Wyland

Надеюсь, я не слишком поздно пришла на вечеринку.

Это на самом деле не большая жирная ложь, а маленький недосмотр.

Атрибут showAsAction должен быть определен с использованием другого пространства имен "http://schemas.Android.com/apk/res-auto"

Поэтому вы должны в своем верхнем теге меню определить пространство имен следующим образом xmlns:app="http://schemas.Android.com/apk/res-auto"

а затем используйте это, чтобы определить свой атрибут showAsAction следующим образом app:showAsAction="ifRoom"

Это должно это исправить

35
josagyemang

Это связано с тем, что задано максимальное количество элементов, которые должны перейти на панель действий, и оно, по-видимому, равно 4. Конечно, вы можете заставить их появляться, установив showAsAction: always, но в отношении руководств по API Google:

Если вы считаете, что более четырех пунктов вашего меню могут быть оправданы Что касается действий, то вы должны внимательно рассмотреть их родственника уровень важности и попытайтесь установить не более четырех в качестве элементов действия (и сделайте это, используя значение «ifRoom», чтобы позволить системе поместить немного обратно в меню переполнения, когда пространство ограничено на небольших экранах) . Даже если место доступно на широком экране, вы не должны создавать длинный поток элементов действий, которые загромождают пользовательский интерфейс и выглядят как панель инструментов рабочего стола, поэтому количество элементов действия должно быть минимальным.

Кроме того, следующие действия никогда не должны отображаться как действие пункты: Настройки, Справка, Обратная связь или аналогичные. Всегда держите их в переполнение меню.

12
Michał Z.

В дополнение к ответу Михала З.: Шаблоны страниц Руководства по Android для Android -> Панель действий говорит следующее в главе «Кнопки действий»:

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

Сколько действий поместится в основной панели действий? Емкость панели действий контролируется по следующим правилам:

  • Кнопки действий на главной панели действий могут занимать не более 50% ширины панели
  • Кнопки действий на нижней панели действий могут использовать всю ширину.
  • Ширина экрана в пикселях, не зависящих от плотности (dp), определяет количество элементов, которые поместятся на главной панели действий:
    • меньше чем 360 dp = 2 иконки
    • 360-499 дп = 3 иконки
    • 500-599 дп = 4 иконки
    • 600 дп и больше = 5 значков
10
arne.jans

используйте app:showAsAction="always" вместо Android:showAsAction="always"

4
Rahul_Pawar

Использование

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
2
Ravi Karki

ActivityBar стремится не превышать некоторое количество видимых элементов. И этот предел ниже, чем ActivityBar может содержать действительно. Ограничение установлено в Android.support.v7.view.ActionBarPolicy class:

`/**
     * Returns the maximum number of action buttons that should be permitted within an action
     * bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
     * "always" items can override this.
     */
    public int getMaxActionButtons() {
        final Resources res = mContext.getResources();
        final int widthDp = ConfigurationHelper.getScreenWidthDp(res);
        final int heightDp = ConfigurationHelper.getScreenHeightDp(res);
        final int smallest = ConfigurationHelper.getSmallestScreenWidthDp(res);

if (smallest > 600 || widthDp > 600 || (widthDp > 960 && heightDp > 720) || (widthDp > 720 && heightDp > 960)) { // For values-w600dp, values-sw600dp and values-xlarge. return 5; } else if (widthDp >= 500 || (widthDp > 640 && heightDp > 480) || (widthDp > 480 && heightDp > 640)) { // For values-w500dp and values-large. return 4; } else if (widthDp >= 360) { // For values-w360dp. return 3; } else { return 2; } }`

Как видите, предел составляет от 2 до 5, и это зависит от ширины экрана. 

Я не смог найти способ изменить это поведение. Поэтому, если вы хотите превысить лимит, вы должны использовать showAsAction = "Always" или создать свой собственный вид для ActionBar .

0
ivan

Используйте этот код ниже, он всегда будет работать

<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>
0
Creator