更改弹出菜单样式 - 无效

6

我希望为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();
    }
}

Styles.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>

但是菜单背景仍然是白色的,它应该是黑色的。有什么想法是哪里出了问题吗?

[编辑] 根据评论,更新代码:

<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();
    }

结果与我的预期不符。

result

菜单背景仍然是黑色的,而不是我想设置的颜色。


请使用android:background替代使用android:popupBackground。 - vijaya zararia
4个回答

13

我也尝试了上面提到的解决方案,但我的弹出菜单颜色没有改变,所以最终我采取了以下方法:

1.创建一个自定义的drawable,并设置所需的颜色,具体如下:

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();
}

以下是我使用这段代码获得的结果 在此输入图片描述

希望这可以帮助你。


如何使用此解决方案更改文本背景和文本颜色?如果我将颜色设置为透明,那么文本背景就不会是透明的。 - user1209216
您可以通过在 MyPopupMenu 中提及 <item name="android:textColor">#ff0000</item> 来更改文本颜色。 - Ichigo Kurosaki
它能工作...但是当菜单项被选中时(通过长按它),它看起来很糟糕,因为菜单项的颜色改变了,而文本背景没有改变。有什么解决办法吗? - user1209216
我已经更新了我的回答,建议使用 itemBackground 而不是更改背景属性。 - Ichigo Kurosaki
谢谢,它起作用了。但是,我无法设置更低的不透明度使菜单透明,有什么解决办法吗? - user1209216

5
你应该尝试这个:
 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();
    }

1
在我的情况下,使用getApplicationContext()就可以了。为什么不能直接在xml中声明样式? - user1209216
因为它是膨胀视图,所以你不能声明样式来充气。这也是它的菜单xml文件。我尝试了很多次,都失败了。所以我做了这个,现在可以用了。 - Sagar Chavada
在我的styles.xml文件中,我将背景颜色设置为红色。但是使用你的代码后,无论我设置什么颜色,菜单背景总是黑色,菜单文本总是白色。但是 - 我的gateContext未定义,所以我使用了getApplicationContext。 - user1209216
澄清一下,我想要的是在styles.xml中设置的自定义颜色,而不仅仅是黑色。 - user1209216
请将此行代码从您的 AppTheme 中移除: <item name="popupMenuStyle">@style/PopupMenu</item> - Sagar Chavada
显示剩余5条评论

2

在原问题中,您所需做的就是更改:

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

to:

 <item name="android:itemBackground">@android:color/white</item>

0

我的问题是使用了错误的弹出菜单填充器。从以下代码进行更改:

popup.getMenuInflater().inflate(R.menu.menu_language, popup.getMenu());

popup.inflate(R.menu.menu_language)

运行成功!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接