如何以编程方式更改 ActionBar 中的单个操作项文本颜色?
How to change individual action item text color in ActionBar PROGRAMMATICALLY?
在我的 ActionBar
中,我有一个具有属性 showAsAction="always"
的 MenuItem
,如下图所示。根据用户与我们服务器的连接,我将更改项目的文本和颜色。
目前,我可以很容易地在 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;
}
结果
在我的 ActionBar
中,我有一个具有属性 showAsAction="always"
的 MenuItem
,如下图所示。根据用户与我们服务器的连接,我将更改项目的文本和颜色。
目前,我可以很容易地在 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;
}
结果