本文实例讲述了Android编程实现自定义PopupMenu样式。分享给大家供大家参考,具体如下:
PopupMenu是Android中一个十分轻量级的组件。与PopupWindow相比,PopupMenu的可自定义的能力较小,但使用更加方便。
先上效果图:
尝试{ 字段字段=popupMenu.getClass () .getDeclaredField (“mPopup”); field.setAccessible(真正的); MenuPopupHelper mHelper=(MenuPopupHelper) field.get (popupMenu); mHelper.setForceShowIcon(真正的); }捕捉(IllegalAccessException | NoSuchFieldException e) { e.printStackTrace (); } >之前
2。在菜单项上添加单?复选按钮:在菜单的资源文件中使用组标签为项添加分组即可。
menu_popup.xml:
& lt;菜单xmlns: android=" http://schemas.android.com/apk/res/android " xmlns:应用=" http://schemas.android.com/apk/res-auto "比; & lt;组android: checkableBehavior=暗ド怼北? & lt;项目 android: id=癅 + id/menu_setting_wifi” android: title=笆褂肳IFI” android: orderInCategory=" 80 " android:图标=" @drawable/menu_setting_wifi” 应用:showAsAction=" ifRoom "/比; & lt;项目 android: id=癅 + id/menu_setting_gps” android: title=笆褂肎PS” android: orderInCategory=" 90 " android:图标=" @drawable/menu_setting_gps” 应用:showAsAction=" ifRoom "/比; & lt;/group> & lt; group> & lt;项目 android: id=癅 + id/menu_setting_userIcon” android: title=吧柚猛废瘛? android:图标=" @drawable/menu_setting_usericon” android: orderInCategory=" 91 " 应用:showAsAction=按硬弧?比; & lt;/group> & lt;/menu> >之前其中,checkableBehavior有3个值可选:单身,,没有,分别表示单选,复选,不可选。
3。为上述单?复选按钮自定义图标。
PopupMenu会从当前的背景中继承样式,因此可以通过设置活动的样式来控制PopupMenu的样式。
& lt; !——自定义PopupMenu上的RadioButton的样式——比; & lt;样式名=" PopupMenuStyle "父=癆ppTheme”比; & lt;项目名称=" android: radioButtonStyle "祝辞@style/MenuRadioButtonStyle & lt;/style> & lt;样式名=" MenuRadioButtonStyle "父=癅android:风格/Widget.CompoundButton.RadioButton”比; & lt;项目名称=癮ndroid:按钮”祝辞@drawable/selector_menu_rb & lt;/style> >之前同时在清单中为PopupMenu所属的活动添加样式:
& lt;活动 android: name=" .PopupMenuActivity " android:主题=癅style/PopupMenuStyle”/比; >之前补充:也可以在初始话PopupMenu的时候直接设置样式。但是这种方式编译器会多次出现警告:太多的属性引用。因此不建议使用。
上下文包装器=new ContextThemeWrapper(活动,R.style.PopupMenuStyle); PopupMenu PopupMenu=new PopupMenu(活动,咒符); >之前活动部分完整代码:
/* * *自定义PopupMenu *由hanj 15-3-17。 */公开课PopupMenuActivity延伸活动{ @Override 保护无效onCreate(包savedInstanceState) { super.onCreate (savedInstanceState); 林LinearLayout LinearLayout=new (); 按钮btn=new按钮(这); LinearLayout。新LinearLayout.LayoutParams LayoutParams p=( LinearLayout.LayoutParams。WRAP_CONTENT LinearLayout.LayoutParams.WRAP_CONTENT); btn.setLayoutParams (p); lin.addView (btn); btn.setText(“显示PopupMenu”); btn。setOnClickListener(新View.OnClickListener () { @Override 公共空间onClick(查看v) { showPopupMenu (PopupMenuActivity。这,v); } }); setContentView(林); }//当前选择的菜单项的标识 私人int checkedItemId=R.id.menu_setting_wifi; 私人空间showPopupMenu(最后的上下文语境,视图咒符){ PopupMenu PopupMenu=new PopupMenu(上下文,咒符);//引入菜单资源 popupMenu.inflate (R.menu.menu_popup);//设置选中 popupMenu.getMenu () .findItem (checkedItemId) .setChecked(真正的);//菜单项的监听 popupMenu。setOnMenuItemClickListener(新PopupMenu.OnMenuItemClickListener () { @Override 公共布尔onMenuItemClick(菜单项菜单项){ 开关(menuItem.getItemId ()) { 案例R.id.menu_setting_wifi: checkedItemId=R.id.menu_setting_wifi; 吐司。makeText(上下文、“无线”Toast.LENGTH_SHORT),告诉(); 打破; 案例R.id.menu_setting_gps: checkedItemId=R.id.menu_setting_gps; 吐司。makeText(上下文、“GPS”Toast.LENGTH_SHORT),告诉(); 打破; 案例R.id.menu_setting_userIcon: 吐司。makeText(上下文、“USER_ICON Toast.LENGTH_SHORT),告诉(); 打破; } 返回true; } });//使用反射,强制显示菜单图标 尝试{ 字段字段=popupMenu.getClass () .getDeclaredField (“mPopup”); field.setAccessible(真正的); MenuPopupHelper mHelper=(MenuPopupHelper) field.get (popupMenu); mHelper.setForceShowIcon(真正的); }捕捉(IllegalAccessException | NoSuchFieldException e) { e.printStackTrace (); }//显示PopupMenu popupMenu.show (); } }Android编程实现自定义PopupMenu样式示例【显示图标与设置RadioButton图标】