Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式更改ActionBar中单个操作项的文本颜色?_Java_Android_Android Actionbar - Fatal编程技术网

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;
}