【问题标题】:How to change background color popup menu android如何更改背景颜色弹出菜单android
【发布时间】:2014-02-09 11:16:08
【问题描述】:

我从查询数据库生成菜单的每个选项。 这是我的代码。

final PopupMenu popupMenu = new PopupMenu(getBaseContext(), v); 
SQLiteDatabase db = AdapterDb.getReadableDatabase(); 
Cursor cursor = db.rawQuery(sql, null);
int ctritem = 0;
if (cursor.moveToFirst()) {
    popupMenu.getMenu().add(Menu.NONE, ctritem, Menu.NONE, "ALL ITEMS"); 
    do {
        ctritem++;   
        popupMenu.getMenu().add(Menu.NONE, ctritem, Menu.NONE, cursor.getString(0)); 
    } while (cursor.moveToNext());
}

一切正常,但问题是如何更改选项菜单的颜色或弹出菜单的背景颜色(从黑色变为白色),可以吗? 谢谢

【问题讨论】:

  • 你能帮我彼得吗?谢谢
  • 糟糕!谷歌浏览器找不到 pastebin.com
  • 我可以看到我的发布源代码@pastebin,不是吗?

标签: android menu colors popup


【解决方案1】:

为你的 AppTheme 添加 popupMenu 样式:

<style name="AppTheme" parent="android:Theme.Light">
    <item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>

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

manifest.xml:

 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
.............
</application>

【讨论】:

  • 这对我有用。我可以更改 Popupmenu 的文本颜色吗?
  • 您是否控制了传递给构造函数的上下文?我在使用时遇到了同样的问题: PopupMenu popup = new PopupMenu(mContext, v);我将错误的上下文传递给 PopupMenu 构造函数。
  • 影子呢??随着以下它失去阴影
  • 如果我正在使用 AppTheme.NoActionBar,该怎么做。我的意思是它不工作我使用 noactionbar 。
  • 我认为这个答案并不完整,仅仅阅读这篇不完整的帖子是无法解决问题的
【解决方案2】:

请在样式 xml 文件中添加以下行,我希望这对材料设计应用有所帮助。 样式.xml

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

    <!-- To change the popup menu and app text color  -->
    <item name="android:textColor">@color/colorPrimary</item>

    <!-- To change the background of options menu-->
    <item name="android:itemBackground">@color/skyBlue</item>
</style>

更多详情请参考此链接http://www.viralandroid.com/2016/01/how-to-change-background-and-text-color-of-android-actionbar-option-menu.html

【讨论】:

  • 为我工作! 2020 年 2 月。
  • 最好使用android:itemTextAppearance 而不是android:textColor。经测试。工作。
  • 另外android:itemBackground 最好是可绘制的,您可以在其中定义默认状态和按下状态的行为。如果您将android:itemBackground 设置为颜色,则项目会产生涟漪效果
【解决方案3】:

如果您使用的是 AppCompact-v7,那么您可以为 PopupMenu 设置如下样式:

 <style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="popupMenuStyle">@style/popupMenuStyle</item>
</style>

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

注意:PopMenu 始终适用于活动上下文,而不是应用程序上下文。

【讨论】:

  • 如果您使用这样的 Activity 上下文创建 PopupMenu,它会起作用:new PopupMenu(getActivity(), ...) e 不是这样:new PopupMenu(getActivity().getApplicationContext(), 。 ..).
  • PopMenu 始终与活动上下文一起使用,而不是与应用程序上下文一起使用。如果你对这篇文章投了反对票,那么我请求你投赞成票。
  • 您最后一次对此答案投票是 11 月 14 日 16:20。除非编辑此答案,否则您的投票现在已锁定。目前无法...
  • 使用 getActivity() 而不是应用程序上下文为我修复了它!
  • @Dunfield 太好了,您可以投票以帮助其他人将其识别为可行的解决方案。
【解决方案4】:

如果您使用的是 AppCompat 主题,请使用

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

</style>

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="popupMenuStyle">@style/PopupMenu</item>
</style>

否则

<style name="AppTheme" parent="android:Theme.Light">
    <item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>

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

</style>

【讨论】:

  • AppCompat 版本不适合我。菜单背景仍然是白色的。
【解决方案5】:

首先在styles.xml 文件中定义弹出菜单背景的样式 就我而言,我使用这个...

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>
<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
    <item name="android:popupBackground">@android:color/holo_green_light</item>
</style>

在这里,我想更改特定活动中的弹出菜单背景,因此将主题(android:theme="@style/AppTheme") 与活动声明一起应用,它肯定可以工作。 使用此代码创建弹出菜单的另一重要事项 PopupMenu popup = new PopupMenu(your activity, viewObj);

【讨论】:

    【解决方案6】:

    在您提供工具栏的布局中,通过 app:popupTheme="@style/MyPopupMenu" 指定主题

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:background="#2196F3"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        style="@style/DrawerArrowStyle"
        app:popupTheme="@style/MyPopupMenu">
    
    </android.support.v7.widget.Toolbar>
    

    【讨论】:

    • 抱歉,我认为这解决了它,但我真的只需要在创建弹出窗口时更改为 getActivity() 作为上下文。
    【解决方案7】:

    将 PopupMenu 主题添加到您的 AppTheme:

    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="popupTheme">@style/PopupMenuTheme</item>
    </style>
    
    <style name="PopupMenuTheme" parent="Theme.AppCompat.Light">
        <item name="android:background">@android:color/white</item>
    </style>
    

    manifest.xml:

    <application
        ...
        android:theme="@style/AppTheme">
        ...
    </application>
    

    【讨论】:

      【解决方案8】:

      时尚 您的应用主题

       <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
           <!-- Customize your theme here. -->
       <item name="android:itemBackground">@color/list_background</item>
       <item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item>
          </style>
      

      用于文本外观

       <style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
              <item name="background">@color/list_item_title</item>
              <item name="titleTextStyle">@style/MyActionBarTitle</item>
          </style>
          <style name="MyActionBarTitle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
              <item name="android:textColor">@color/list_item_title</item>
          </style>
      
          <style name="MyActionBar.MenuTextStyle"
              parent="style/TextAppearance.AppCompat.Widget.ActionBar.Title">
              <item name="android:textColor">@color/list_item_title</item>
              <item name="android:textStyle">normal</item>
              <item name="android:textSize">16sp</item>
              <item name="android:gravity">center</item>
          </style>
      

      并在 Menifest 中使用应用主题,例如:

      <application
              android:name="Your Package"
              android:allowBackup="true"
              android:icon="@drawable/launcher_icon"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >
      

      【讨论】:

        【解决方案9】:

        更多解释请参考How to style PopupMenu?。我遇到了同样的问题,搜索了很多,但在提到的链接中找到了解决方案。

        PopupMenu 的创建方式如下:

        PopupMenu popup = new PopupMenu(context, view);
        

        PopupMenu 采用传递的上下文的样式,传递 Activity 作为上下文解决了我的问题。

        【讨论】:

          【解决方案10】:
          <style name="AppTheme1" parent= "android:Theme.DeviceDefault">
          
              <item name="android:actionBarPopupTheme">@style/popupNew</item>
          </style>
          
          <style name="popupNew" parent="android:ThemeOverlay.Material.Light">
              <item name="android:colorBackground">#ffffff</item>
          </style>
          

          【讨论】:

          • 请解释为什么您的提案解决了 OP 的问题。
          【解决方案11】:

          将此添加到您的 style.xml 文件中

          <style name="PopupMenu" parent="Theme.AppCompat.Light">
              <item name="android:popupBackground">@android:color/white</item>
          </style>
          

          在 Spinner 上设置样式

          <Spinner
          android:theme="@style/PopupMenu"
          android:popupMenuStyle="@style/PopupMenu"/>
          

          这也适用于 API 级别 16+ 的设备。

          【讨论】:

            【解决方案12】:

            ANDROIDMAINFEST.xml 中无需做任何更改

            结帐

            您可以在片段或活动中通过提供或屏蔽自定义主题来实现它,并且在制作自定义主题后,您必须将该上下文传递给弹出菜单。 首先在菜单中创建弹出菜单布局

            <?xml version="1.0" encoding="utf-8"?>
            <menu xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto">
                <item
                    android:id="@+id/remove"
                    android:title="Remove downloads"
            
                    />
            </menu>
            

            在 style.xml 中第二个样式

             <style name="CustomPopUpStyle" parent="Widget.AppCompat.PopupMenu">
                <item name="android:textColor">@android:color/white</item>
                <item name="android:itemBackground">@color/bgColor</item>
            </style>
             
            

            方法

             private fun showPopupMenu(context: Context, view: View) {
                    var wrapper: Context =  ContextThemeWrapper(context, R.style.CustomPopUpStyle)
                    val popup = PopupMenu(wrapper, view)
                    popup.inflate(R.menu.popup_menu)
                    popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener { item: MenuItem? ->
                        when (item!!.itemId) {
                            R.id.remove -> {
                                Toast.makeText(context, item.title, Toast.LENGTH_SHORT).show()
                            }
                        }
            
                        true
                    })
            
                    popup.show()
                }
            

            最后初始化

             showPopupMenu(holder.itemView.context, holder.viewDataBinding.more)
            

            这是我在片段中的 recyclerview 适配器中完成的

            希望你喜欢它。

            代码也是不言自明的。

            【讨论】:

              【解决方案13】:

              你可以像这样使用自定义布局..

              PopupMenu pop = new PopupMenu(MainActivity.this, v);
              pop.getMenuInflater().inflate(R.menu.main, pop.getMenu());
              pop.show();
              

              按您的意愿设计布局..希望这会有所帮助..

              【讨论】:

              • 是什么意思?试过了吗?我不知道您的要求...如果您使用弹出对话框,那么您可以更改背景颜色
              • @vnshetty 我正在使用它,但我无法更改项目的 textSize。我通过更改 styles.xml 中的文本大小尝试了很多示例,但没有任何价值。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-03-16
              • 2015-04-06
              • 1970-01-01
              • 2019-02-25
              • 2017-08-26
              • 2018-02-01
              • 2015-05-12
              相关资源
              最近更新 更多