Java 如何以编程方式更改ActionBar中单个操作项的文本颜色?
在我的Java 如何以编程方式更改ActionBar中单个操作项的文本颜色?,java,android,android-actionbar,Java,Android,Android Actionbar,在我的ActionBar中,我有一个MenuItem,它具有属性showAsAction=“always”,如下图所示。根据用户与我们服务器的连接,我将更改项目的文本和颜色 目前,我能够在onprepareOptions菜单(…)中非常轻松地更改项目的文本: 这是伟大的作品,如果可能的话,我想改变这里的文字颜色以及。我看过很多关于如何更改所有溢出项的文本或ActionBar本身的标题的帖子,但没有任何关于以编程方式更改单个操作项的帖子。当前颜色是用xml设置的,我想动态更改它 好吧,每个菜单项
ActionBar
中,我有一个MenuItem
,它具有属性showAsAction=“always”
,如下图所示。根据用户与我们服务器的连接,我将更改项目的文本和颜色
目前,我能够在onprepareOptions菜单(…)
中非常轻松地更改项目的文本:
这是伟大的作品,如果可能的话,我想改变这里的文字颜色以及。我看过很多关于如何更改所有溢出项的文本或
ActionBar
本身的标题的帖子,但没有任何关于以编程方式更改单个操作项的帖子。当前颜色是用xml设置的,我想动态更改它 好吧,每个菜单项
视图
实际上都是,因此这将使更改文本颜色更容易
查找菜单项
视图
的一个简单方法是
一个基本的实现,考虑到您只有一个MenuItem
,您对更改感兴趣,可能看起来像这样:
private final ArrayList<View> mMenuItems = Lists.newArrayList();
private boolean mIsConnected;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Add a your MenuItem
menu.add("Connected").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
// Adjust the text color based on the connection
final TextView connected = !mMenuItems.isEmpty() ? (TextView) mMenuItems.get(0) : null;
if (connected != null) {
connected.setTextColor(mIsConnected ? Color.GREEN : Color.RED);
} else {
// Find the "Connected" MenuItem View
final View decor = getWindow().getDecorView();
decor.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mIsConnected = true;
// Remove the previously installed OnGlobalLayoutListener
decor.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// Traverse the decor hierarchy to locate the MenuItem
decor.findViewsWithText(mMenuItems, "Connected",
View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
// Invalidate the options menu to display the new text color
invalidateOptionsMenu();
}
});
}
return true;
}
private final ArrayList mMenuItems=Lists.newArrayList();
私有布尔错误连接;
@凌驾
公共布尔onCreateOptions菜单(菜单){
//添加一个菜单项
menu.add(“Connected”).setShowAsAction(MenuItem.SHOW\u AS\u ACTION\u IF\u ROOM);
//根据连接调整文本颜色
连接的最终文本视图=!mMenuItems.isEmpty()?(文本视图)mMenuItems.get(0):null;
如果(已连接!=null){
已连接.setTextColor(连接错误?Color.GREEN:Color.RED);
}否则{
//查找“已连接”菜单项视图
最终视图装饰=getWindow().getDecorView();
decor.getViewTreeObserver().addOnGlobalLayoutListener(新OnGlobalLayoutListener()){
@凌驾
公共图书馆{
错误连接=正确;
//删除以前安装的OnGlobalLayoutListener
decor.getViewTreeObserver().removeOnGlobalLayoutListener(此);
//遍历装饰层次以定位菜单项
装饰。FindViewWithText(mMenuItems,“已连接”,
查看。查找带有内容描述的视图);
//使选项菜单无效以显示新的文本颜色
无效操作菜单();
}
});
}
返回true;
}
结果
@LittleChild这些解决方案都不是我的……谢谢,这正是我想要的!您尚未初始化mMenuItems。当使用
工具栏
和AppCompat而不是操作栏
private final ArrayList<View> mMenuItems = Lists.newArrayList();
private boolean mIsConnected;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Add a your MenuItem
menu.add("Connected").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
// Adjust the text color based on the connection
final TextView connected = !mMenuItems.isEmpty() ? (TextView) mMenuItems.get(0) : null;
if (connected != null) {
connected.setTextColor(mIsConnected ? Color.GREEN : Color.RED);
} else {
// Find the "Connected" MenuItem View
final View decor = getWindow().getDecorView();
decor.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mIsConnected = true;
// Remove the previously installed OnGlobalLayoutListener
decor.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// Traverse the decor hierarchy to locate the MenuItem
decor.findViewsWithText(mMenuItems, "Connected",
View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
// Invalidate the options menu to display the new text color
invalidateOptionsMenu();
}
});
}
return true;
}