动态设置MenuItem颜色

为了更好的贴近Google设计规范,开始使用Toolbar自定义布局同时设置为ActionBar,在设置的过程中,为了更好的贴近App风格,MenuItem的颜色就需要改变了.

  1. style中设置颜色:

     <style name="ActionBarMenuText" parent="TextAppearance.AppCompat.Widget.ActionBar.Menu">
         <item name="android:textColor">@color/dark_pink</item>
         <item name="android:textSize">@dimen/title_text_size</item>
         <item name="android:layout_marginRight">10dp</item>
     </style>

    这种方式在Nexus上测试可以直接改变,当时也就没有太注意,可是突然发现小米竟然没有改变颜色,于是就只能使用反射来改变了

  2. 利用反射改变:

     public static void setActionBarText(final Activity activity) {
         try {
             final LayoutInflater inflater = activity.getLayoutInflater();
             Field field = LayoutInflater.class.getDeclaredField("mFactorySet");
             field.setAccessible(true);
             field.setBoolean(inflater, false);
             LayoutInflaterCompat.setFactory(inflater, new LayoutInflaterFactory() {
                 @Override
                 public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
                 //因为我使用的是supportv7包
                     if (name.equalsIgnoreCase("android.support.v7.view.menu.IconMenuItemView")
                             || name.equalsIgnoreCase("android.support.v7.view.menu.ActionMenuItemView")) {
                         final View view;
                         try {
                             view = inflater.createView(name, null, attrs);
                             if (view instanceof TextView)
                                 ((TextView) view).setTextColor(activity.getResources().getColor(R.color.dark_pink));
                             return view;
                         } catch (ClassNotFoundException e) {
                             e.printStackTrace();
                         } catch (InflateException ex) {
                             ex.printStackTrace();
                         }
                     }
                     return null;
                 }
             });
         } catch (Exception e) {
    
         }
    
     }

    该方法在Activity的onCreate()时调用即可.

  3. 无论是style还是反射去改变,都只会在Activity创建时设置一次,创建后不好再改变其颜色.但事实上MenuItem也是一个View,在运行时也可以通过View的寻找方式去动态设置:

     View title = getWindow().getDecorView().findViewById(<-- textView的id -->);
     //当然也可以通过findViewByTag()等方法
     if (title != null && title instanceof TextView) {
        ((TextView) title).setTextColor(getResources().getColor(R.color.dark_pink));
     }