动态设置MenuItem颜色
为了更好的贴近Google设计规范,开始使用Toolbar自定义布局同时设置为ActionBar,在设置的过程中,为了更好的贴近App风格,MenuItem的颜色就需要改变了.
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上测试可以直接改变,当时也就没有太注意,可是突然发现小米竟然没有改变颜色,于是就只能使用反射来改变了
利用反射改变:
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()时调用即可.
无论是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)); }