如何在ActionBARTICALLY中更改ActionBar中的单个操作项文本颜色?

时间:2015-02-16 14:36:12

标签: java android android-actionbar

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

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,我想动态更改它。

1 个答案:

答案 0 :(得分:7)

好吧,每个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