我对接受的答案不满意,因为它没有真正解释为什么OPs自定义弹出式样式没有应用 – 不仅仅是背景,还有文字颜色等 – 所以我做了自己的实验.
重要的是要注意工具栏创建的弹出窗口(当它有菜单项时)和使用PopupMenu自己显示的弹出窗口之间存在差异.这些由不同的主题属性控制.另外,请注意有两个PopupMenu类:android.widget.PopupMenu和android.support.v7.widget.PopupMenu.
你明确显示的PopupMenus样式所需的主题属性是android:popupMenuStyle或popupMenuStyle.您有几个选项可以正确应用自定义样式:
(1)在活动(或应用程序)的主题中使用android:popupMenuStyle
@style/PopupMenu
@style/PopupMenu
@color/popupBackground
PopupMenu popup = new PopupMenu(this, anchorView);
请注意,在布局文件中不需要额外的内容.
(2)使用ContextThemeWrapper
@style/PopupMenu
@style/PopupMenu
@color/popupBackground
ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.CustomPopupTheme);
PopupMenu popup = new PopupMenu(ctw, anchorView);
注意在构造ContextThemeWrapper时,如何不直接使用R.style.PopupMenu.这看起来有点迂回,但是如果你想让弹出主题与活动或应用主题分开(例如,可能只有一些弹出窗口需要你的特殊主题),它会很有用.
(3)使用AppBarLayout的上下文
@style/PopupMenu
@style/PopupMenu
@color/popupBackground
@color/popupBackground
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppBarOverlay">
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/PopupOverlay"/>
AppBarLayout appBar = (AppBarLayout) findViewById(R.id.app_bar);
PopupMenu popup = new PopupMenu(appBar.getContext(), anchorView);
由于您已经拥有AppBar的主题叠加层,因此您可以使用它来保存弹出式主题参考.这也适用于工具栏的上下文,至少考虑到当前的布局,但请注意app:popupTheme在这里实际上并不相关,因为它影响工具栏的弹出窗口,而不是PopupMenu.还要注意这与上面的选项2有多相似,这应该让你了解android:theme属性如何在引擎盖下工作;)
在我的实验中,android:itemBackground仅在我使用PopupOverlay样式代替android:colorBackground时才起作用.但是,最好使用android:colorBackground,因为这会改变弹出窗口的颜色,使圆角和可选项突出显示/纹理完整.