всплывающее меню привязки над кнопкой переполнения

Я пытаюсь создать пользовательское всплывающее меню, которое я хотел бы разместить на кнопке меню переполнения панели действий (для этого я использую Toolbar с setSupportActionBar(), если это имеет значение). Я узнал, что это можно сделать с помощью setAnchorView() (прочитав пункт Custom Menu в меню Overflow ).

Однако я не могу понять, как получить меню переполнения в виде представления (которое я мог бы использовать для установки привязки).

Также я попытался привязать это к родительскому макету самого действия, но оно появилось слева вверху, а высота меню была равна высоте панели действий (что не очень полезно).

Кто-нибудь знает, как этого можно достичь?


person source.rar    schedule 03.03.2015    source источник


Ответы (3)


Вместо того, чтобы иметь настоящее меню переполнения, вы можете немного «обмануть». На панели действий должен быть значок, похожий на значок переполнения. Вы должны установить showAsAction всегда на этом MenuItem. При нажатии на значок переполнения отображается ListPopupWindow, привязанный к MenuItem Посмотреть. Если ListPopupWindow не появляется там, где вы хотите, вы можете позвонить ListPopupWindow.setHorizontalOffset() и ListPopupWindow.setVerticalOffset().

person Andrew Orobator    schedule 10.03.2015
comment
Спасибо. Попробую это и скоро опубликую. :) - person source.rar; 10.03.2015
comment
Очень хорошая идея. Но, столкнувшись с этой проблемой, я остановился на использовании PopupMenu, который намного проще в использовании, чем ListPopupWindow, который, помимо своей сложности, имеет недостаток, заключающийся в том, что его размеры указываются в физических пикселях. - person Papa Smurf; 25.05.2019

Я согласен с Эндрю Оробатором в том, что его, скорее всего, нужно будет «подделать», но я бы порекомендовал добавить реальный вид на панель инструментов вместо того, чтобы пытаться иметь дело с элементами меню:

<?xml version="1.0" encoding="utf-8"?>
   <android.support.v7.widget.Toolbar
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/toolbar"
   android:layout_height="wrap_content"
   android:layout_width="match_parent"
   android:minHeight="?attr/actionBarSize"
   android:background="?attr/colorPrimary"
   android:elevation="@dimen/elevation_med">

<ImageView
    android:id="@+id/overflow"
    android:layout_width="2dp"
    android:layout_height="2dp"
    android:background="@drawable/overflow_icon"
    android:layout_gravity="right"/>

</android.support.v7.widget.Toolbar>

Таким образом, вы можете напрямую получить вид с панели инструментов через toolbar.findViewById(R.id.overflow); или что-то подобное, затем установите представление в качестве привязки. Это означает, что вам также придется установить для него свои собственные прослушиватели onClick, поскольку он больше не будет получать обратные вызовы onOptionsMenu(), но я думаю, что это будет лучший способ справиться с вашим сценарием.

person Jawnnypoo    schedule 10.03.2015

Я узнал, как получить представление из пункта меню здесь: Android: получить представление Ссылка на пункт меню

  1. Вызовите View v = findViewById(R.id.overflow) в вашем методе onOptionsItemSelected.

  2. Используйте это представление в качестве привязки во всплывающем меню: PopupMenu popupMenu = new PopupMenu(this, v);

person Simon    schedule 13.11.2015