Как сделать так, чтобы всплывающее меню переполнения не мешало панели действий?

Задний план

В моем приложении , когда я обновился до новой библиотеки поддержки, а также попробовал Lollipop, я заметил странную проблему: при нажатии на кнопку переполнения на панели действий (или даже на новую Toolbar класс) покажет всплывающее меню поверх панели действий, скрывая другие действия, как таковые:

Здесь скрытыми элементами действия являются удаление и совместное использование.

Проблема

Я пытался избежать этой проблемы, переопределив стиль меню переполнения, но ничего не помогло.

Мало того, кажется, что это преднамеренное поведения, однако во многих приложениях Google, которые были обновлены для поддержки Material Design, это поведение не поддерживается, как я сообщал здесь.

Что я пробовал

Я пытался создать это в теме, которую использую. На самом деле моя тема очень отличается, и ее родителем является «Theme.AppCompat.Light.NoActionBar» (и я использую панель инструментов в качестве панели действий), но в этом фрагменте тоже есть эта проблема, поэтому я думаю, что если одна будет решена, другая будет слишком.

В любом случае, вот фрагмент:

<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="AppBaseTheme" parent="Theme.AppCompat.Light"></style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:actionOverflowMenuStyle" tools:targetApi="21">@style/OverflowMenu</item>
    </style>

    <style name="OverflowMenu" parent="@android:style/Widget.Material.PopupMenu.Overflow" tools:targetApi="21">
        <item name="android:overlapAnchor">false</item>
        <item name="android:dropDownVerticalOffset">50dip</item>
    </style>

</resources>

Оба атрибута ничего не изменили.

Я также пытался найти, как это работает в библиотеке поддержки, но не смог найти.

Вопрос

Как сделать всплывающее меню элемента действия переполнения, чтобы не скрывать другой элемент?


person android developer    schedule 24.11.2014    source источник
comment
Тема Material (не то же самое, что дизайн Material) и AppCompat соответствуют стандартам, изложенным в проектной документации. В частности, нарушение рекомендаций по дизайну не является чем-то, что вы можете сделать.   -  person ianhanniballake    schedule 25.11.2014
comment
@ianhanniballake Пожалуйста, прочитайте все, что я написал. Это то, чего не делают даже приложения Google для материального дизайна. Кроме того, это вызывает другие проблемы (о которых я предупреждал), о которых сообщали другие люди.   -  person android developer    schedule 25.11.2014
comment
Вы можете написать приложение, разработанное в стиле Material, без использования AppCompat или фактической темы Material: в тех приложениях, которые используют тему AppCompat/Material, отображаются только всплывающие меню, перекрывающие кнопку.   -  person ianhanniballake    schedule 25.11.2014
comment
Вы расширяете AppCompat для темы вашего приложения?   -  person alanv    schedule 25.11.2014
comment
Кроме того, примечание: как разработчик платформы Android, написавший стили и темы Material Design, я могу заверить вас, что поведение перекрытия по умолчанию правильное.   -  person alanv    schedule 25.11.2014
comment
@androiddeveloper overlapAnchor — это то, что вы ищете. Попробуйте удалить префикс android перед применением actionOverflowMenuStyle и убедитесь, что вы расширяете тему AppCompat. См. PopupWindow и < a href="https://github.com/android/platform_frameworks_support/blob/master/v7/appcompat/src/android/support/v7/internal/widget/AppCompatPopupWindow.java#L48" rel="nofollow noreferrer">AppCompatPopupWindow   -  person adneal    schedule 25.11.2014
comment
Я не понимаю проблемы, вы выбрали слишком открытое меню переполнения, так почему вы хотите, чтобы другой элемент был виден, если вы все равно не можете взаимодействовать с ними, пока не закроете меню переполнения?   -  person tyczj    schedule 25.11.2014
comment
@alanv Я пробовал и тему AppCompat, и тему Material. У обоих были эти проблемы, и я попытался установить атрибуты на обоих. Что вы имеете в виду, что поведение перекрытия по умолчанию является правильным? Пожалуйста, объясните, почему вы считаете, что это лучше, так как я написал несколько причин, почему это неправильно (в сообщении: code.google.com/p/android-developer-preview/issues/ ), и, как я и ожидал, это приводит к случайному выбору пользователями. Кроме того, похоже, что Google не следует этому правилу, поэтому имеет смысл использовать предыдущее поведение.   -  person android developer    schedule 25.11.2014
comment
@adneal Это первое предположение, которое у меня было, но, возможно, я делал это неправильно. Не могли бы вы опубликовать образец, который, по вашему мнению, работает?   -  person android developer    schedule 25.11.2014
comment
@tyczj См. этот пост, который я написал по причинам, почему это проблема: code.google.com/p/android-developer-preview/issues/ . Также поищите на веб-сайте проблемы, связанные с меню переполнения. Я заметил по крайней мере один, который описывает ту же проблему, что и я написал (люди случайно выбирают первый пункт).   -  person android developer    schedule 25.11.2014
comment
Не могли бы вы включить фрагмент XML для темы вашего приложения? Если вы ориентируетесь на материал и используете встроенную панель действий, опубликованный вами XML должен работать.   -  person alanv    schedule 25.11.2014
comment
@alanv Тема довольно большая (и ее родителем является Theme.AppCompat.Light.NoActionBar ), поэтому я сделал крошечный пример приложения, чтобы показать эту проблему. обновил вопрос. Это происходит даже для Theme.AppCompat.Light. Если я решу это там, это (надеюсь) сработает и для моего приложения.   -  person android developer    schedule 25.11.2014


Ответы (1)


Если вы используете ActionBarActivity, вам потребуется переопределить версию appcompat стиля меню переполнения вместе с версиями appcompat атрибутов всплывающих окон, где это применимо.

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light" />

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
    </style>

    <style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
        <!-- Required for pre-Lollipop. -->
        <item name="overlapAnchor">false</item>

        <!-- Required for Lollipop. -->
        <item name="android:overlapAnchor">false</item>
    </style>

</resources>
person alanv    schedule 25.11.2014
comment
Это сработало. Спасибо. Думаю, я был не так далек от ответа... :) - person android developer; 25.11.2014
comment
К сожалению, при переопределении стилей и тем appcompat все еще требуется много догадок и проверок. В будущем должно стать легче. - person alanv; 25.11.2014
comment
Скажите, а можно ли установить его во время выполнения? - person android developer; 26.11.2014
comment
Нет, но это свойство PopupWindow, которое обернуто PopupMenu на несколько уровней глубже и в любом случае не будет доступно. - person alanv; 27.11.2014
comment
Очень плохо. В любом случае, спасибо. - person android developer; 27.11.2014
comment
Если вы получаете предупреждение Target Api, например: android:overlapAnchor needs Api 21, реализуйте этот ответ так - person Beytan Kurt; 12.05.2016
comment
Этот ответ также включает verticalOffset, который в моем случае был необходим: stackoverflow.com/a/29468611/284420 - person Beytan Kurt; 12.05.2016