`
wx1569488408
  • 浏览: 75243 次
文章分类
社区版块
存档分类
最新评论

PopupMenu坑爹使用和设置style样式详说

 
阅读更多

PopuMenu的默认的样子是不怎么的:

 

image

 

文字很粗,22sp,按下的背景很黄。于是,研究怎么修改其样式。最后发现,PopuMenu的使用实在是太坑了,实在是一点也不好使,完全建议抛弃吧,还不如自己封装PopupWindow成菜单。现记录如下:

 

样式的修改流程:

1、直接修改主题样式方法

(1)创建PopupMenu样式;

(2)创建Activity主题样式,并将PopupMenu样式添加进来;

(3)在AndroidMainfest.xml中配置Activity的主题

 

2、通过构造方法,参数最多的那个。

        PopupMenu popupMenu = new PopupMenu(getBaseContext(), v,Gravity.NO_GRAVITY,0,R.style.popMenu_style);

但是,无论我怎么使用就是不成功,就是崩溃。因为这货需要到安卓5.1(api22以上)才会支持

 

存在的问题:

1、在Activity主题低于Holo下(api11以下),无论怎么修改样式都无效。

PopupMenu样式:

 
 
     <style name="popMenu_style" parent="@android:style/Widget.PopupMenu">
         <item name="android:dropDownSelector">@drawable/popenu_background</item>
         <item name="android:background">@color/springgreen</item>
        <item name="android:textSize">5sp</item>
    </style>

 

Activity主题:

 
 
    <style name="Theme_Zoon_white" mce_bogus="1" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowAnimationStyle">@style/Activity_Animation_Zoon</item>
        <item name="android:popupMenuStyle">@style/popMenu_style</item>
    </style>

 

Java代码使用:

PopupMenu popupMenu = new PopupMenu(Activity.this, v);

getMenuInflater().inflate(R.menu.core_more_popmenu, popupMenu.getMenu());

popupMenu.show();

 
 
 
 

既然PopupMenu继承context主题,那么改变Context主题总可以了吧,然而,事实是,就算这么搞:

Context context = getBaseContext();
context.setTheme(R.style.popMenu_style);
PopupMenu popupMenu = new PopupMenu(context, v);

 

也是没用的,变灰,但是什么用的都没有:

 

image

 

2、当Activity的主题为Holo时、

PopupMenu样式:

 
 
     <style name="popMenu_style" parent="@android:style/Widget.PopupMenu">
         <item name="android:dropDownSelector">@drawable/popenu_background</item>
         <item name="android:popupBackground">@color/springgreen</item>
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/black</item>
    </style>
     

Activity主题:

 

 
style name="Theme_Zoon_white" mce_bogus="1" parent="@android:style/Theme.Holo.NoActionBar"> 
        <item name="android:windowAnimationStyle">@style/Activity_Animation_Zoon</item>
        <item name="android:popupMenuStyle">@style/popMenu_style</item>
    </style>

 

Java代码:

PopupMenu popupMenu = new PopupMenu(getBaseContext(), v);

 

效果则是黑麻麻的一片,设置的TextView的颜色,PopupMenu的背景都无效。但文字的大小有改变,但不是自己设置的大小:

image

 

 

而当context对象设置为Activity.this代码时:

PopupMenu popupMenu = new PopupMenu(Activity..this,v);

 

 

3.当Activity的主题为Holo.Light时(api13以上)

PopupMenu样式:

 
<style name="popMenu_style" parent="@android:style/Widget.Holo.Light.PopupMenu"> 
         <item name="android:dropDownSelector">@drawable/popenu_background</item>
         <item name="android:background">@color/springgreen</item>
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/green</item>
    </style>

 

Activity主题:

 
<style name="Theme_Zoon_white" mce_bogus="1" parent="@android:style/Theme.Holo.Light.NoActionBar"> 
        <item name="android:windowAnimationStyle">@style/Activity_Animation_Zoon</item>
        <item name="android:popupMenuStyle">@style/popMenu_style</item>
    </style>

 

Java代码:

PopupMenu popupMenu = new PopupMenu(this, v);

 

文字颜色和点击颜色,背景颜色设置仍然无效,Light的默认色则是白色。同样只有文字大小有改变,但也不是自己设置的值:

 

image

 

此时,若java代码写的是getBaseContext,则又是黑麻麻一片,但能看见文字等。

 

image

 

原因大概是BaseContext拥有父的主题,Holo.Light的父样式,就是Holo.显示是黑的。

 

总结:

PopupMenu很糟糕,很糟糕。熬买糕。

文字大的一逼。

要想使用的好,需要继承Holo或Holo.Light的样式,才能好使一点。可自定义性实在不高。可以考虑趴趴源码,用反射的方式再修改一些东东。

还是推荐使用自己定义PopupWindow为菜单来的可靠。

 

为什么会如此?内部的样式定义怎么会这么难搞?不知道,得继续研究啊。。。。

转载于:https://my.oschina.net/mingyueyixi/blog/746028

分享到:
评论

相关推荐

    popupmenu的详细使用demo

    在这个“popupmenu的详细使用demo”中,我们将探讨如何设置`PopupMenu`的背景颜色、字体大小以及处理单行点击事件。 1. 创建`PopupMenu` 首先,我们需要在Java代码中创建`PopupMenu`实例。通常在响应某个视图的点击...

    PopupMenu 的使用

    若需调整位置,可以通过`PopupMenu.Builder`的`anchorView()`方法设置锚点,或使用`offsetX`和`offsetY`调整偏移量。 ```java PopupMenu popupMenu = new PopupMenu.Builder(this) .anchorView(button) .offset(0...

    ActionBar AcitonMode PopupMenu 结合使用小demo

    将`ActionBar`、`ActionMode`和`PopupMenu`结合使用,可以创建出更灵活、更符合用户预期的界面。例如,在一个列表应用中,当用户长按列表项时,可以启动`ActionMode`,在`ActionMode`的`ToolBar`上展示一个`...

    Android编程实现自定义PopupMenu样式示例【显示图标与设置RadioButton图标】

    本文实例讲述了Android编程实现自定义PopupMenu样式。分享给大家供大家参考,具体如下: PopupMenu是Android中一个十分轻量级的组件。与PopupWindow相比,PopupMenu的可自定义的能力较小,但使用更加方便。 先上效果...

    使用PopupWindow实现的Popup菜单,PopupMenu可以根据ListView item的位置变化

    通过设置其大小、背景、内容等属性,我们可以自定义弹出窗口的样式和行为。在创建`PopupWindow`时,通常需要提供一个View作为内容视图,例如一个包含多个选项的`LinearLayout`或`ListView`。 要实现在`ListView` ...

    MatlabGUI基础知识popupmenu使用属性调用-test_time.fig

    MatlabGUI基础知识popupmenu使用属性调用-test_time.fig 我已经实行了基本功能,留给大家随意扩展! matlab_popupmenu.JPG

    A0248使用PopupMenu1

    - **自定义布局**:通过XML文件可以定义菜单项的图标、文本和样式。 - **定位灵活**:根据屏幕空间自动决定菜单出现在View的上方还是下方。 - **易于交互**:可以通过设置监听器响应用户的点击事件,进行相应的业务...

    delphi自定义控件菜单PopupMenu

    可以使用TPopupMenu来创建菜单,然后在事件处理函数中调用PopupMenu方法来显示它。为了增加用户体验,可以添加动画效果,比如淡入淡出,以及设置合适的弹出位置,确保菜单不会超出屏幕边界。 自定义控件的创建涉及...

    popupmenu.rar_matlab popupmenu_matlab下拉菜单_popupmenu_popupmenu in

    本教程将详细讲解如何在MATLAB中创建和使用`popupmenu`,以及如何将其与图形元素结合,实现颜色选择功能。 首先,创建`popupmenu`的基本步骤如下: 1. **创建figure窗口**:使用`figure`函数创建一个新的图形窗口...

    Delphi演示PopupMenu与ListView各个子项如何关联..rar

    在Delphi编程环境中,PopupMenu和ListView是两种常用的控件,它们在开发用户界面时发挥着重要作用。PopupMenu提供了上下文敏感的菜单,而ListView则用于显示多列数据的列表。将PopupMenu与ListView的各个子项关联...

    ActionMode和PopupMenu应用

    在Android开发中,ActionMode和PopupMenu是两种常用的交互模式,它们为用户提供了一种在特定上下文中操作数据的方式。本文将详细解析这两种模式的使用方法、功能特性以及它们在实际应用中的实现。 首先,我们来了解...

    optionMenu contextMenu popupMenu的集合

    在IT领域,特别是软件开发和用户界面设计中,`optionMenu`、`contextMenu`和`popupMenu`是三种常见的菜单类型,它们在提供用户交互和功能选择方面扮演着重要角色。下面将详细阐述这三个概念及其应用。 首先,`...

    MatlabGUI基础知识popupmenu使用属性调用-test_time.m

    MatlabGUI基础知识popupmenu使用属性调用-test_time.m 我已经实行了基本功能,留给大家随意扩展! matlab_popupmenu.JPG

    PopUpMenu快捷菜单

    本主题将深入探讨如何使用MFC实现"PopUpMenu"快捷菜单,这是一个非常实用的功能,尤其对于提高用户界面的交互性至关重要。在描述中提到的源码包括视图程序和对话框程序,这为我们提供了在不同场景下使用快捷菜单的...

    imag-popupmenu.zip

    在实际应用中,开发者可以通过设置`PopupMenu`的`setGravity()`方法来改变菜单的弹出位置,使用`setOnDismissListener()`来监听菜单的关闭事件,以及使用`dismiss()`方法手动关闭菜单。此外,还可以通过`MenuItem`...

    popupmenu弹出位置

    PopupMenu提供了更加便捷的方式来创建和管理这种浮动窗口,特别适合在上下文相关的操作中使用。 1. **默认弹出位置**: 默认情况下,PopupMenu会在触发它的View的底部弹出。这是因为在创建PopupMenu时,系统会自动...

    Android中PopupMenu组件的使用实例

    本文将深入探讨PopupMenu的使用方法,并通过具体的实例来解释如何在项目中集成这一组件。 首先,要使用PopupMenu,我们需要创建一个菜单资源文件。在`res`目录下创建一个新的`menu`文件夹,如果没有的话。在这个...

    delphi xe5 popupmenu源码

    `popupmenu.dproj`是Delphi的项目文件,它存储了关于项目配置的信息,包括编译器设置、链接器选项、使用的单元等。这个文件对于管理项目构建过程和版本控制至关重要,因为它定义了项目构建的规则和依赖。 `main.fmx...

    popupMenu弹出菜单

    在Android开发中,`PopupMenu`是一个非常实用的功能,它允许我们为特定的...正确理解和使用`PopupMenu`,可以显著提升应用的用户体验。在实际开发中,应根据具体需求灵活运用,并关注其在不同设备和系统版本上的表现。

Global site tag (gtag.js) - Google Analytics