Изменить стиль всплывающего меню - не работает

Я пытаюсь применить стиль к всплывающему меню Android. Меню отображается при нажатии кнопки. В моем примере я хочу установить черный фон меню.

Итак, схема моего меню:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="Item 1"
        android:id="@+id/menu1">
    </item>

    <item
        android:title="Item 2"
        android:id="@+id/menu2">
    </item>

</menu>

Далее мой макет активности:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.michal.popupmenu.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="btnClick"
        android:nestedScrollingEnabled="true"/>
</RelativeLayout>

Код для отображения меню при нажатии кнопки:

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void btnClick(View view)
    {
        showMenu(view);

    }


    public void showMenu(View v)
    {
        PopupMenu popup = new PopupMenu(this, v);
        popup.inflate(R.menu.popup_menu);
        popup.show();
    }
}

Стили XML были сгенерированы автоматически. Я только добавил стиль меню, чтобы установить черный фон меню, вот он:

<style name="PopupMenu" parent="Widget.AppCompat.PopupMenu">
    <item name="android:popupBackground">@android:color/black</item>

</style>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="popupMenuStyle">@style/PopupMenu</item>
</style>

But still menu background is white and it should be black. Any ideas what's wrong?

[править] Согласно комментариям, обновленный код:

<resources>

    <style name="PopupMenu" parent="@style/Widget.AppCompat.Light.PopupMenu">
        <item name="android:popupBackground">#FF4081</item>
    </style>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>



</resources>

Основная деятельность:

public void showMenu(View v)
    {
        Context wrapper = new ContextThemeWrapper(getApplicationContext(), R.style.PopupMenu);
        PopupMenu popup = new PopupMenu(wrapper, v);

        // This activity implements OnMenuItemClickListener
        //popup.setOnMenuItemClickListener((PopupMenu.OnMenuItemClickListener) this);
        popup.inflate(R.menu.popup_menu);
        popup.show();
    }

Результат не тот, что я ожидаю

результат

Фон меню по-прежнему черный, а не тот цвет, который я хочу установить.


person user1209216    schedule 02.09.2016    source источник


Ответы (4)


Я также попробовал упомянутое выше решение, но цвет моего всплывающего меню не изменился, поэтому я сделал следующее:

1. Создал пользовательский рисунок с требуемым цветом следующим образом:

popup_color_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
  <selector
      xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true">
     <color
         android:color="@color/colorPrimary"/>
      </item>
      <item>
          <color
              android:color="#655611"/>
      </item>
  </selector>

Добавлено state_pressed для получения эффекта выбора

2. В моем styles.xml добавлен следующий код:

<style name="MyPopupMenu" parent="Widget.AppCompat.PopupMenu">
    <item name="android:itemBackground">@drawable/popup_color_drawable</item>
</style>

Я использую Theme.AppCompat.Light.DarkActionBar в качестве базовой темы для приложения.

3. Затем в моей деятельности

public void showpopup(View view){
    Context wrapper = new ContextThemeWrapper(this, R.style.MyPopupMenu);
    PopupMenu popup = new PopupMenu(wrapper, view);
    popup.inflate(R.menu.popup_menu);
    popup.show();
}

Ниже приведен результат, который я получил, используя этот код введите здесь описание изображения

Надеюсь, это поможет вам.

person Ichigo Kurosaki    schedule 02.09.2016
comment
Как изменить фон текста и цвет текста с помощью этого приложения? Если я устанавливаю цвет прозрачным, я получаю непрозрачный фон текста. - person user1209216; 02.09.2016
comment
вы можете изменить цвет текста, указав <item name="android:textColor">#ff0000</item> в MyPopupMenu - person Ichigo Kurosaki; 02.09.2016
comment
Это работает ... однако это выглядит плохо, когда выбран пункт меню (нажав и удерживая его), потому что цвет пункта меню изменяется, а фон текста - нет. Есть ли какое-нибудь решение для этого? - person user1209216; 02.09.2016
comment
Вместо изменения свойства фона используйте itemBackground, я обновил свой ответ - person Ichigo Kurosaki; 02.09.2016
comment
Спасибо, это сработало. Однако я не могу установить более низкую непрозрачность, чтобы сделать меню прозрачным, есть ли какое-либо решение для этого? - person user1209216; 05.09.2016

вы должны попробовать это:

 public void showMenu(View v)
    {
        Context wrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenu);
        PopupMenu popup = new PopupMenu(wrapper, v);
        popup.inflate(R.menu.popup_menu);
        popup.show();
    }
person Sagar Chavada    schedule 02.09.2016
comment
В моем случае getApplicationContext() работает. Почему я не могу объявить стиль непосредственно в xml? - person user1209216; 02.09.2016
comment
bcz его завышенный вид .. вы не можете объявить стиль завышенным видом. а также XML-файл его меню. я пытался так много раз, и я потерпел неудачу .. поэтому я сделал это, и это сработало .. - person Sagar Chavada; 02.09.2016
comment
Одно редактирование... не работает. Теперь фон меню всегда черный, а текст всегда белый. Не я устанавливаю значения. - person user1209216; 02.09.2016
comment
что вы имели в виду .. Теперь фон меню всегда черный, а текст всегда белый, это то, что вы хотите, верно ..? а также вы можете изменить цвет текста - person Sagar Chavada; 02.09.2016
comment
В моем файле styles.xml я установил красный цвет фона. Но с вашим кодом я всегда получаю черный фон меню и белый текст меню, независимо от того, какой цвет я установил. Но у меня не определено значение gateContext, поэтому вместо этого я использовал getApplicationContext. - person user1209216; 02.09.2016
comment
Чтобы уточнить, мне нужен собственный цвет, который я установил в styles.xml, а не только черный. - person user1209216; 02.09.2016
comment
bcz у меня есть фрагмент, поэтому я использую getContext(), и у вас есть активность, поэтому вы можете использовать getApplicationContext(). - person Sagar Chavada; 02.09.2016
comment
удалите эту строку в AppTheme: ‹item name=popupMenuStyle›@style/PopupMenu‹/item› - person Sagar Chavada; 02.09.2016
comment
Используйте @android:color/black вместо @color/whateverColor. - person Sagar Chavada; 02.09.2016
comment
Вопрос обновлен. Почему по-прежнему фон меню черный? - person user1209216; 02.09.2016

В исходном вопросе все, что вам нужно было сделать, это изменить:

<item name="android:popupBackground">#FF4081</item>

to:

 <item name="android:itemBackground">@android:color/white</item>
person Clive Jefferies    schedule 08.11.2016

моя проблема заключалась в использовании неправильного всплывающего окна. Изменение с:

popup.menuInflater.inflate(R.menu.menu_language, popup.menu)

to

popup.inflate(R.menu.menu_language)

работает!

person You Qi    schedule 03.12.2018