阳光博文 你的空间 知识的容器

Actionbar右侧overflow的这个三个点的图标问题

方法目前有三种,第一种:在style中静态替换属性,代码如下:
  1. <!-- 重写actionbar中 OverFlow的属性 -->
  2.     <style name="OverFlow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
  3.         <item name="android:src">@drawable/index_title_more</item>
  4.     </style>
  5. <style name="LevelOnePageActionBar" parent="@android:style/Theme.Holo.Light" type="text/css">
  6.         <item name="android:actionOverflowButtonStyle">@style/OverFlow</item>
  7.     </style>

复制代码

然后把这个style加到minifest中相应的activity中,就可以了。

第二种方法,可以动态的替换这个图标,首先在style中给添加一个name,代码如下:
  1. <style name="OverFlow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
  2.         <item name="android:contentDescription">@string/accessibility_overflow</item>
  3.     </style>
  4. <style name="LevelOnePageActionBar" parent="@android:style/Theme.Holo.Light" >
  5.         <!-- 下面这个属性石替换三个点图标的 -->
  6.         <item name="android:actionOverflowButtonStyle">@style/OverFlow</item>
  7.     </style>

复制代码

然后在代码中添加如下代码:
  1. // The content description used to locate the overflow button
  2.             final String overflowDesc = getString(R.string.accessibility_overflow);
  3.             // The top-level window
  4.             final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
  5.             // Wait a moment to ensure the overflow button can be located
  6.             decor.postDelayed(new Runnable() {

  7.                 @Override
  8.                 public void run() {
  9.                         // The List that contains the matching views
  10.                         final ArrayList<View> outViews = new ArrayList<View>();
  11.                         // Traverse the view-hierarchy and locate the overflow button
  12.                         decor.findViewsWithText(outViews, overflowDesc,View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
  13.                         // Guard against any errors
  14.                         if (outViews.isEmpty()) {
  15.                                 return;
  16.                         }
  17.                         // Do something with the view
  18.                         final ImageButton overflow = (ImageButton) outViews.get(0);
  19.                         overflow.setImageResource(R.drawable.index_title_menu);
  20.                 }
  21.             }, 1000);
复制代码


这个有个缺点,就是图标的大小尺寸貌似不可控,如果图标够大,他就只能显示图片的一部分了,而且,大家也可以看见,其实用起来也比较麻烦。

下面就介绍第三种方法,这个简单易懂,比阿奴理解:
这个我们不用去特意设置style,首先去改变一下menu的布局,代码如下:
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     tools:context="com.example.normalproject.MainActivity" >

  4.     <item
  5.         android:id="@+id/action_usercenter"
  6.         android:icon="@drawable/index_title_usercenter"
  7.         android:orderInCategory="100"
  8.         android:showAsAction="always"
  9.         android:title="@string/action_usercenter_tx"/>
  10.     <item
  11.         android:orderInCategory="100"
  12.         android:id="@+id/overflow_menus"
  13.         android:actionProviderClass="@android:style/Widget.Holo.ActionButton.Overflow"
  14.         android:showAsAction="always"
  15.         android:title="@string/accessibility_overflow">
  16.         <menu>
  17.             <item
  18.                 android:id="@+id/action_messagebox"
  19.                 android:icon="@drawable/index_title_usercenter"
  20.                 android:orderInCategory="100"
  21.                 android:showAsAction="never"
  22.                 android:title="@string/messagebox_title_tx"/>
  23.             <item
  24.                 android:id="@+id/action_feedback"
  25.                 android:orderInCategory="100"
  26.                 android:showAsAction="never"
  27.                 android:title="@string/feedback_title_tx"/>
  28.             <item
  29.                 android:id="@+id/action_settings"
  30.                 android:orderInCategory="100"
  31.                 android:showAsAction="never"
  32.                 android:title="@string/action_settings_tx"/>
  33.         </menu>
  34.     </item>

  35. </menu>
复制代码

是的,就是利用menu的嵌套,把我们想要隐藏的菜单用menu标签包起来,再嵌入到一个item里面,这个被嵌入的item的showAsAction属性设置成为always,这样,我们就可以用代码动态的去改变这个item的icon了,如果你不需要动态改变(那么就直接用第一种方法),代码中我们需要在onOptionsItemSelected(MenuItem item)方法中做好事件监听处理,并且,在onPrepareOptionsMenu(Menu menu)中处理图片动态替换,代码如下:
  1. if(DataBaseOptions.getInstance(this).checkNotReadPushMessage()>0){
  2.                         menu.getItem(1).setIcon(R.drawable.index_title_usercenter);//替换图标
  3.                 }else{
  4.                         menu.getItem(1).setIcon(R.drawable.index_title_more);
  5.                 }
复制代码

需要改变图片的时候,就调用invalidateOptionsMenu();方法,nice,就是这么任性~~~
效果如下:
C:\Users\Administrator\Desktop\11.png

在线咨询