java - 如何以编程方式更改 ActionBar 中的单个操作项文本颜色?

标签 java android android-actionbar

在我的 ActionBar 中,我有一个具有属性 showAsAction="always"MenuItem,如下图所示。根据用户与我们服务器的连接,我将更改项目的文本和颜色。

Current action bar

目前,我可以在 onPrepareOptionsMenu(...) 中轻松更改项目的文本:

 @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem item = menu.findItem(R.id.action_connection);
    if(mIsConnected) {
        item.setTitle(R.string.action_connected);
    } else {
        item.setTitle(R.string.action_not_connected);
    }
    return super.onPrepareOptionsMenu(menu);
}

效果很好,如果可能的话,我也想更改此处文本的颜色。我看过很多关于如何更改所有溢出项的文本或 ActionBar 本身的标题的帖子,但没有关于以编程方式更改单个操作项的帖子。当前颜色在xml中设置,我想动态改变它。

最佳答案

好吧,每个 MenuItem View 实际上是 a subclass of TextView , 所以这将使更改文本颜色更容易。

可用于定位MenuItem View 的简单方法是View.findViewsWithText .

一个基本的实现,考虑到你只有一个 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;
}

结果

results

关于java - 如何以编程方式更改 ActionBar 中的单个操作项文本颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28543760/

相关文章:

Java Spring PropertyPlaceholderConfigurer 以及如何修剪属性文件中的空格/制表符

java - 在某些情况下,Ebean 中急于获取 blob

android - 重启智能手机后放大我创建的墙纸

android - 如何防止登录用户返回到 Android 中的登录/注册屏幕?

java - 将 Action 添加到 Action Bar Android

Android Material Design 抽屉导航菜单图标更改

java - 使用 RecursiveElementNameAndTextQualifier(XMLUnit)

java - 如何使用 Java 在 Axe-Core 中运行特定标签的可访问性测试

android - 使用矢量图形而不是位图在 Canvas 上绘制路径?

java - 操作栏在 Android 应用程序中显示为空