android popupmenu 自定义样式,Android:自己定义PopupMenu的样式(显示图标/设置RadioButton图标)...

article/2025/9/28 22:17:15

PopupMenu是Android中一个十分轻量级的组件。与PopupWindow相比,PopupMenu的可自己定义的能力较小,但使用更加方便。

先上效果图:

7a503f92126f4e3ece962eba9f16a9be.png

本例要实现的功能例如以下:

1.强制显示菜单项的图标。

默认状态下。PopupMenu的图标是不显示的。而且Android没有为我们开放不论什么API去设置它的显示状态。为了显示菜单项的图标,能够自己重写PopupMenu并改动相关属性,也能够直接使用反射:

try {

Field field = popupMenu.getClass().getDeclaredField("mPopup");

field.setAccessible(true);

MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);

mHelper.setForceShowIcon(true);

} catch (IllegalAccessException | NoSuchFieldException e) {

e.printStackTrace();

}

2.在菜单项上加入 单选/复选 button:在menu的资源文件里使用group标签为item加入分组就可以。

menu_popup.xml:

xmlns:app="http://schemas.android.com/apk/res-auto">

android:id="@+id/menu_setting_wifi"

android:title="使用WIFI"

android:orderInCategory="80"

android:icon="@drawable/menu_setting_wifi"

app:showAsAction="ifRoom" />

android:id="@+id/menu_setting_gps"

android:title="使用GPS"

android:orderInCategory="90"

android:icon="@drawable/menu_setting_gps"

app:showAsAction="ifRoom" />

android:id="@+id/menu_setting_userIcon"

android:title="设置头像"

android:icon="@drawable/menu_setting_usericon"

android:orderInCategory="91"

app:showAsAction="never" />

当中,checkableBehavior有3个值可选:single,all,none,分别表示单选、复选、不可选。

3.为上述 单选/复选 button自己定义图标。

PopupMenu会从当前的context中继承样式,因此能够通过设置Activity的样式来控制PopupMenu的样式。

@style/MenuRadioButtonStyle

@drawable/selector_menu_rb

同一时候在manifest中为PopupMenu所属的Activity加入样式:

android:name=".PopupMenuActivity"

android:theme="@style/PopupMenuStyle" />

补充:也能够在初始话PopupMenu的时候直接设置样式。可是这样的方式编译器会多次出现警告:Too many attribute references。因此不建议使用。

Context wrapper = new ContextThemeWrapper(activity, R.style.PopupMenuStyle);

PopupMenu popupMenu = new PopupMenu(activity, ancher);

======  ======

Activity部分完整代码:

/**

* 自己定义PopupMenu

* Created by hanj on 15-3-17.

*/

public class PopupMenuActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

LinearLayout lin = new LinearLayout(this);

Button btn = new Button(this);

LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

btn.setLayoutParams(p);

lin.addView(btn);

btn.setText("显示PopupMenu");

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

showPopupMenu(PopupMenuActivity.this, v);

}

});

setContentView(lin);

}

//当前选择的menuItem的id

private int checkedItemId = R.id.menu_setting_wifi;

private void showPopupMenu(final Context context, View ancher) {

PopupMenu popupMenu = new PopupMenu(context, ancher);

//引入菜单资源

popupMenu.inflate(R.menu.menu_popup);

//设置选中

popupMenu.getMenu().findItem(checkedItemId).setChecked(true);

//菜单项的监听

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

@Override

public boolean onMenuItemClick(MenuItem menuItem) {

switch (menuItem.getItemId()) {

case R.id.menu_setting_wifi:

checkedItemId = R.id.menu_setting_wifi;

Toast.makeText(context, "WIFI", Toast.LENGTH_SHORT).show();

break;

case R.id.menu_setting_gps:

checkedItemId = R.id.menu_setting_gps;

Toast.makeText(context, "GPS", Toast.LENGTH_SHORT).show();

break;

case R.id.menu_setting_userIcon:

Toast.makeText(context, "USER_ICON", Toast.LENGTH_SHORT).show();

break;

}

return true;

}

});

//使用反射。强制显示菜单图标

try {

Field field = popupMenu.getClass().getDeclaredField("mPopup");

field.setAccessible(true);

MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);

mHelper.setForceShowIcon(true);

} catch (IllegalAccessException | NoSuchFieldException e) {

e.printStackTrace();

}

//显示PopupMenu

popupMenu.show();

}

}


http://chatgpt.dhexx.cn/article/4qqU6bki.shtml

相关文章

android popupmenu 动态添加,Android PopupMenu弹出菜单的实现

Android PopupMenu弹出菜单的实现 发布时间:2020-09-03 21:43:38 来源:脚本之家 阅读:135 作者:徐刘根 Android PopupMenu弹出菜单的实现 (1)布局文件:用于弹出菜单的处罚button: xmlns:tools"http://…

设置PopupMenu全屏宽度

val popupMenu: PopupMenu PopupMenu(requireContext(), it)popupMenu.menu.add("测试Menu1")popupMenu.menu.add("测试Menu1")//反射获取Popupval mPopupMenu: Field popupMenu.javaClass.getDeclaredField("mPopup")mPopupMenu.isAccessible…

android popupmenu 动态添加,android中PopupMenu的使用

PopupMenu可以非常方便的在指定view的下面显示一个弹出菜单,类似于actionbar溢出菜单的效果。它的菜单选项可以来自于menu资源,因此非常方便。下面是在网上找的一个PopupMenu的运行图片。 使用方法 res/menu下面新建 popup_menu.xml xmlns:tools"ht…

PopupMenu 的使用

//显示更多菜单private void showMoreMenu(View v) {PopupMenu popupMenu new PopupMenu(getContext(), v);popupMenu.inflate(R.menu.menu_more);if (isBlackMenu)popupMenu.getMenu().findItem(R.id.block).setTitle("移除黑名单");elsepopupMenu.getMenu().findI…

android popupmenu 动态添加,Android PopupMenu 的使用

Android 轻量化组件 PopupMenu 的使用 估计很多人遇到过这种场景: 要求弹出的PopupWindow里面是一个列表,我们使用时都是在里面套个ListView或RecyclerView ,现在我们不需要在做这样繁琐的工作了。 在官方android.support.v7.widget 包下提供…

android实现菜单栏第三部分popupmenu,弹出式菜单

点击布局内菜单按钮会弹出菜单 就成跟其他菜单差不多&#xff0c;首先是在主界面建一个按钮&#xff0c;然后写出菜单布局&#xff0c;最后在主页面写出逻辑&#xff0c;按钮我们写一个点击事件&#xff0c;等会在主界面在这个点击事件里面写菜单 <?xml version"1.0…

PopupMenu的简要使用

PopupMenu的创建&#xff0c;使用及常见用法 一&#xff1a;功能概述 PopupMenu可以非常方便的在指定view的下面显示一个弹出菜单&#xff0c;该弹出菜单的位置是可变的。在一些应用里面例如浏览器里面长按屏幕会显示弹出菜单。 二&#xff1a;创建基本流程 1&#xff1a;创…

解决IOS select下拉框样式

文章目录 问题解决方法 问题 一般来说&#xff0c;在ios端&#xff0c;对于select下拉框会默认出现黑色背景&#xff0c;input输入框上面出现阴影&#xff0c;导致用户体验感不是很好&#xff0c;总体原因是ios中对透明度渲染的效果不是很好。 会出现如下图所示现象&#xff…

vue3—elementPlus如何单独修改页面中的下拉框样式

vue3中只能去修改popper-class这个属性去修改 &#xff08;自己想要的样式&#xff09;重点 :样式修改不能写在scoped中&#xff0c;可以单独开个style popper-class"blueBack"&#xff08;blueBack为自定义class名&#xff09; <el-select popper-class"blu…

VUE3 如何修改饿了么element-plus的下拉框样式?

VUE3 如何修改饿了么element-plus的下拉框样式&#xff1f; 如图&#xff0c;饿了么的样式 已经不在app里面&#xff0c;所以在页面中无法通过样式穿透进行设置样式&#xff0c;只能修改全局的样式&#xff0c;那么我每个页面的样式不一样 每个页面都需要去改全局样式 我想到的…

Python PyQt5l表单应用 - 自定义选择下拉框样式

如何调整默认选择下拉框的样式呢&#xff1f; 1.文件中引用类 QListView from PyQt5.QtWidgets import QListView 2.在控件中添加样式&#xff0c;示例 self.typeCmb.setObjectName("typeCmb") self.typeCmb.setStyleSheet("#typeCmb{border:1px solid rgb(…

Qt QComboBox 下拉框样式修改

今天查了好多资料&#xff0c;发现做出来的都不理想。去查了下Qt源码。发现setView(QAbstractItemView *itemView)这个方法&#xff0c;官方的解释是这样的&#xff1a; void QComboBox::setView(QAbstractItemView *itemView) Sets the view to be used in the combobox pop…

css修改layui的下拉框样式 js_layui创建表单下拉框样式不显示

border-left: 5px solid #009688; 注释&#xff1a;solid实体&#xff0c;实心样式&#xff1b; Blockquote&#xff1a;块引用;Fieldset&#xff1a;字段集; 1.所有浏览器都支持 标签。 fieldset 元素可将表单内的相关元素分组。 标签将表单内容的一部分打包&#xff0c;生成…

elementUi——select选择框的下拉框样式调整——基础积累

最近在用elementUI写后台管理系统&#xff0c;有个弹窗添加的功能&#xff0c;由于弹窗中的内容只有两项&#xff0c;而下拉框的高度较高&#xff0c;导致页面很空。 需要&#xff1a;将下拉框的高度调小&#xff0c;页面布局会好看。 调整前 调整后 实现 通过elementUi官网…

antd a-select下拉框样式修改 vue3 亲测有效

记录一下遇到的问题 1.遇到问题&#xff1a; 使用到Vue3 Ant Design of Vue 3.2.20&#xff0c;但因为项目需求样式&#xff0c;各种查找资料都未能解决; 2.解决问题&#xff1a; ①我们审查元素可以看到&#xff0c;下拉框是在body中的; ①在a-select 元素上添加dropdownCla…

修改select下拉框样式兼容IE和Chrome浏览器

文章目录 问题解决办法 问题 在Chrome浏览器和IE11浏览器下&#xff0c;select下拉框表现的样式不一致。Chrome浏览器下&#xff0c;如图所示&#xff1a; IE11浏览器下&#xff0c;如图所示&#xff1a; 此时select下拉框的css的代码如下&#xff1a; .Data_select {widt…

QComboBox下拉框样式

QComboBox下拉框样式

自定义elementUI select下拉框样式

无论加important还是deep &#xff0c;发现怎样也改不了下拉框的样式&#xff0c;点击元素发现下拉框与script标签是同级的&#xff08;看下图&#xff09; 官方文档上写加 :popper-append-to-body‘false’ &#xff0c;再修改样式&#xff0c;但对我好像没有用 官方文档上…

a-select 下拉框样式修改

// 下拉框的总的样式/deep/.ant-select-dropdown-menu {background: #091F40;border: 1px solid rgba(122, 191, 255, 0.2);box-shadow: 0px 2px 12px rgba(0, 0, 0, 0.2);border-radius: 2px;height: 200px;}// 下拉框 每个item的样式/deep/.ant-select-dropdown-menu-item {f…

element UI指定下拉框样式修改

在一个页面中&#xff0c;有多个下拉框&#xff0c;由于下拉框等级与dom同级&#xff0c;只能改变所有。 解决&#xff1a;在select 中加入popper-class“名称” 即可为下拉框添加类名&#xff0c;从而修改