80,471
社区成员




原帖来自ligux~~~~傻子啊傻子
如上次教程一样,准备工作是java环境以及反编译工具,还有你从自己ROM里提取出来的framework-res.apk。
反编译之后定位到value/styles.xml
1、查找IconMenu,找到下面的代码:
</style>
<style name="TextAppearance.Widget.IconMenu.Item" parent="@style/TextAppearance.Small">
<item name="textColor">?textColorPrimaryInverse</item>
</style>
可以看到他的color定义,为textColorPrimaryInverse,于是我们继续查找这个textColorPrimaryInverse,在页首发现,他的颜色定义到了
<item name="textColorPrimaryInverse">@color/primary_text_light</item>
就是res/color目录下primary_text_light.xml,找到,打开一看,果然是你现在一直想改掉的X色。
2、开始修改,这里有一个最简单的方法,如下所示
</style>
<style name="TextAppearance.Widget.IconMenu.Item" parent="@style/TextAppearance.Small">
<item name="textColor">?textColorPrimaryInverse</item>
</style>
直接将?textColorPrimaryInverse这一串修改为你想要的颜色,当然这里不能直接用RGB颜色代码了,你可以去color里寻找一个你中意的颜色,实在没有可以自己新建,然后在这里调用。
</style>
<style name="TextAppearance.Widget.IconMenu.Item" parent="@style/TextAppearance.Small">
<item name="textColor">@color/primary_text_lighte</item>
</style>
3、关于ExpandedMenu,看这字面意思就是扩展菜单,简单点儿说就是当你在MENU菜单里点更多的时候弹出的二级菜单。所以,这里一样需要修改。
同样在styles.xml,查找ExpandedMenu,定位到
<style name="Theme.ExpandedMenu" parent="@style/Theme">
<item name="listViewStyle">@style/Widget.ListView.Menu</item>
<item name="windowAnimationStyle">@style/Animation.OptionsPanel</item>
<item name="background">@null</item>
<item name="itemTextAppearance">?textAppearanceLargeInverse</item>
</style>
在这里,加入一行比如<item name="textColor">@color/primary_text_lighte</item>覆盖父级定义,来定义二级菜单的字体颜色。原理同上。
4、最后,编译回去,替换进手机,重启,完成。
Android 在eclipse import 项目时经常有这个问题,关于@override 标示的错误,好多说法是
“在没有进行设置的情况下,eclipse默认使用java 1.5来编译代码,所以经常会出现这个问题。
解决办法:
选择Window –> Preferences –> Java –> Compiler(mac上是Eclipse –> Preferences –> Java –> Compiler),确认选择的是1.6版本的编译器”
可是我打开一看,居然是1.7的,这应该比1.6高级啊,还有错,郁闷了,只能去掉@override的标示,不管他了~
getLayoutInflater().setFactory(new Factory() {
02 @Override
03 public View onCreateView(String name, Context context,
04 AttributeSet attrs) {
05 // TODO Auto-generated method stub
06 if (name.equals("com.android.internal.view.menu.IconMenuItemView")) {
07 LayoutInflater f = getLayoutInflater();
08 try {
09 final View view = f.createView(name, null, attrs); // 尝试创建我们自己布局
10 new Handler().post(new Runnable() {
11 @Override
12 public void run() {
13 view.setBackgroundResource(R.drawable.pressed); // 设置背景为我们自定义的图片
14 }
15 } );
16 return view;
17
18 } catch (InflateException e) {
19 e.printStackTrace();
20 } catch (ClassNotFoundException e) {
21 e.printStackTrace();
22 }
23 }
24 return null;
25 }
26 });
该方法在2.3 上已经没有效果了, 求2.3 版本后如和修改 menu item 按下时候的背景颜色。
protected void setMenuBackGround() {
getLayoutInflater().setFactory(
new android.view.LayoutInflater.Factory() {
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs) {
// TODO Auto-generated method stub
// 指定自定义inflater的对象
if (name
.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
try {
LayoutInflater inflater = getLayoutInflater();
final View view = inflater.createView(name,
null, attrs);
new Handler().post(new Runnable() {
public void run() {
view
.setBackgroundResource(R.drawable.application_background_static);
}
});
return view;
} catch (InflateException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return null;
}
});
}