Android 修改Menu字体颜色和背景
我们知道,在Android中修改TextView的字体颜色,一般是通过setTextColor()方法。虽说Android的Menu菜单项的每一项都是由TextView组成,但是Android的sdk并没有给出具体设置Menu的颜色的api。一般我们只能通过修改Theme来间接修改Menu的样式,但如果需要对单独的某一个Menu修改颜色,这种方法又不行了。
stackoverflow上提出了另外一种方法,即LayoutInflater.Factory,当你通过LayoutInflater去创建一个view或menu时,你就可以通过实现自己的LayoutInflater.Factory来定制自己的View。相关代码如下:
getLayoutInflater().setFactory(new android.view.LayoutInflater.Factory(){ @Override public View onCreateView(String name, Context context, AttributeSet attrs) { if (name.equalsIgnoreCase("com.android.internal.view.menu.ActionMenuItemView")) { try{ LayoutInflater f = LayoutInflater.from(context); final View view = f.createView(name, null, attrs); if(view instanceof TextView) { TextView menuTv = ((TextView)view); //这里你就可以修改TextView的字体颜色,大小,背景等等. menuTv.setTextColor(getResources().getColor(R.color.action_bar_button_text_color)); } return view; }catch (InflateException e) { e.printStackTrace(); }catch (ClassNotFoundException e) { e.printStackTrace(); } } return null; } });
其实,还有另外一种方法。我们知道修改Menu的标题是通过
public MenuItem setTitle(CharSequence title);
这里,介绍一个类SpannableString给大家,如果你做个聊天的表情相关的应用,那么你一定对这个类很熟悉,首先
我们来看下这个类的声明:
public class SpannableString extends SpannableStringInternal implements CharSequence, GetChars, Spannable
可以清楚的看到SpannableString是实现了CharSequence接口的,所以我们可以通过构建一个SpannableString来
间接的修改Menu的字体和颜色。这里我们使用了SpannableStringBuilder,相关代码如下:
/* * Add color to a given text */ private SpannableStringBuilder addColor(CharSequence text, int color) { SpannableStringBuilder builder = new SpannableStringBuilder(text); if (color != 0) { builder.setSpan(new ForegroundColorSpan(color), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return builder; }