Android — добавить пользовательский макет в элемент всплывающего меню

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

Я попытался установить android:actionLayout для этого элемента, связав этот конкретный элемент с файлом xml, который должен создать желаемый макет. Однако, похоже, это не имеет абсолютно никакого эффекта. Оттуда я попытался программно установить actionView - создать собственное представление, а затем установить его для элемента. Все равно никакого эффекта.

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

Вот моя последняя попытка:

// * my_menu.xml
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <group 
        android:id="@+id/menu_title_group" >
        <item 
            android:id="@+id/menu_title_item"
            android:title=""
            app:actionLayout="@layout/popup_menu_title_header_layout" />
    </group>
</menu>

А потом...

// * popup_menu_title_header_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/popup_menu_title_header_text_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    android:gravity="center"
    android:background="@color/red"
    android:textColor="@color/gray"
    android:textSize="16sp"/>

А потом...

    // * ShowPopupMenu.Activity
    PopupMenu popup = new PopupMenu(getActivity(), showMenuButton);
    popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());
    popup.getMenu().findItem(R.id.menu_title_item).setTitle(some_dynamic_string);
    popup.getMenu().add(1,0,0,"some_dynamic_option_title_1");
    popup.getMenu().add(1,1,0,"some_dynamic_option_title_2");

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

Заранее спасибо!


person Warblr    schedule 05.12.2014    source источник
comment
Хм... возможно, не работает, потому что это всплывающее меню НЕ находится в панели действий - оно привязано к стандартной кнопке.   -  person Warblr    schedule 06.12.2014
comment
Вероятно, придется использовать ListPopupWindow - PopupMenu не кажется очень гибким с точки зрения настройки...   -  person Warblr    schedule 07.12.2014
comment
используя всплывающее окно вместо ContextMenu?   -  person DolDurma    schedule 19.02.2015
comment
Я второй использую PopUpWindow, если требуется настройка   -  person PPartisan    schedule 29.07.2019


Ответы (1)


используйте тот же контекст actionBar для создания PopupMenu

actionBar.getThemedContext()

So,

ActionBar actionBar = ((ActionBarActivity)     getActivity()).getSupportActionBar();
  PopupMenu popMenu = new PopupMenu(actionBar.getThemedContext(), anyView);
person Alp    schedule 28.04.2015