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

  

本文实例讲述了Android编程实现自定义PopupMenu样式。分享给大家供大家参考,具体如下:

  

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

  

先上效果图:

  

 Android编程实现自定义PopupMenu样式示例【显示图标与设置RadioButton图标】“> </p>
  <p>本例要实现的功能如下:</p>
  <p> 1。强制显示菜单项的图标。</p>
  <p>默认状态下,PopupMenu的图标是不显示的,并且安卓没有为我们开放任何API去设置它的显示状态。为了显示菜单项的图标,可以自己重写PopupMenu并修改相关属性,也可以直接使用反射:</p>
  
  <pre类=   尝试{   字段字段=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图标】