如何在代码中更改操作栏标题颜色

46

我在为Android版本11及以上编程时,遇到了更改操作栏标题颜色的问题。我可以在xml中完成此操作,但需要在代码中动态更改它。请问我该如何解决?提前感谢。

7个回答

85
你可以使用SpannableString和ForegroundColorSpan来设置标题的颜色。
    Spannable text = new SpannableString(actionBar.getTitle());
    text.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    actionBar.setTitle(text);

12
这应该是被接受的解决方案,依赖于一个内部API(action_bar_title id)是个不好的主意,因为它可能会在没有通知的情况下改变。 - fernandohur
2
这是最佳答案。特别是在KitKat上使用v7 appcompat库时,action_bar_title id解决方案会失败。请使用此答案! - Codeversed
这是非常棒的答案,感谢你的回复。顺便说一句,使用相同的方法,您可以在工具栏标题文本上添加下划线。但这是另一个讨论的话题。 - Stoycho Andreev
也适用于SupportActionBar - RAINA

82

ActionBar 标题的 ID 是隐藏的,换句话说,它是内部的,通常无法访问。但你可以使用 Resources.getIdentifierView.findViewById来引用它。

获取 action_bar_title 的 ID

int titleId = getResources().getIdentifier("action_bar_title", "id", "android");

现在您可以使用该ID与TextView一起使用

TextView abTitle = (TextView) findViewById(titleId);
abTitle.setTextColor(colorId);

1
这个东西对我不起作用。为了确保操作栏中没有静态标题,所以我在getIdentifier方法调用中使用“action_bar_title”。同样适用于“id”和“android”。我正在使用v7-appcompat库。 - MSIslam
4
тдѓТъюУ┐ЎСИфТќ╣Т│Ћт»╣СйаСИЇУхиСйюуће№╝їуА«С┐ЮСйаСй┐ућеуџёТў»setTextColor(getResources().getColor(R.color.myColor))УђїСИЇТў»setTextColor(R.color.myColor)сђѓтюе Android 4.0+ СИіт»╣ТѕЉТЮЦУ»┤У┐љУАїтЙЌтЙѕжА║тѕЕсђѓ - Jonik
你能否添加如何处理字幕的说明? - Mathijs Segers
@MathijsSegers 嗯,只需使用 action_bar_subtitle 即可。 - adneal
1
请注意,ActionBar上的setTitle()方法也接受Spannable,正如@wily在他的答案中提到的那样。当文本的某些部分需要不同的颜色时,这种方式要好得多。 - Diederik
显示剩余6条评论

35

另一种方式是使用Html

getSupportActionBar().setTitle((Html.fromHtml("<font color=\"#FF4444\">" + getString(R.string.some_string) + "</font>")));

2
在我看来,这是最可靠的答案。 - Ercan
2
这对我来说仍然是最可靠的设置方式。 - Cora

16
如果使用v7 appcompat库(已测试r22版本),则可以在替代所有API级别的操作栏的Toolbar对象上调用setTitleTextColor()。例如:
Toolbar actionBarToolbar = (Toolbar)activity.findViewById(R.id.action_bar);
if (actionBarToolbar != null)
    actionBarToolbar.setTitleTextColor(Color.RED);

当我将我的项目升级为编译Lollipop时,这个答案是唯一正确的(Adneal的答案会崩溃) - Fraser
1
我正在使用支持库21.0.3,但它不再起作用了,如果我没有犯任何错误的话。首次尝试IvanP的解决方案是有效的。 - Čikić Nenad
@ČikićNenad 已修复适用于appcompat r22(至少,也应该适用于r21)。 - matiash

9
如果您使用Sherlock Actionbar,则可以在支持的操作栏中(Android 3.0以下)使用sherlock-actionbar-id。
int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");    
if ( 0 == titleId ) 
        titleId = com.actionbarsherlock.R.id.abs__action_bar_title;

1
不能只这样做:getSherlockActivity().getSupportActionBar().setTitle("TITLE"); 吗? - marchinram
2
当然可以这样做,如果你只想改变标题。但是这个问题是关于改变标题颜色的。 - salcosand
因此,您需要在ActionBar中获取TextView,并且要到那里,您需要获取TextView的ID。而Sherlock ActionBar和原生ActionBar中的ID是不同的。 - salcosand

1
使用 Kotlin 和 SupportActionBar,请使用此代码 ->
val mSpannableText = SpannableString(supportActionBar?.title)
    mSpannableText.setSpan(
        ForegroundColorSpan(Color.BLUE),
        0,
        mSpannableText.length,
        Spannable.SPAN_INCLUSIVE_INCLUSIVE
    )
    supportActionBar?.title = mSpannableText

0

若要自定义颜色生效,需要使用NoActionBar主题中的android:Theme.NoTitleBar或其子类之一,然后在布局中手动添加Toobar,最后在活动的onCreate()方法中调用setSupportActionBar

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

然后您可以在工具栏的XML中设置标题颜色:app:titleTextColor="@android:color/white"

请见下方:

<androidx.appcompat.widget.Toolbar
    
  app:navigationContentDescription="@string/abc_action_bar_up_description"
  app:titleTextColor="@android:color/white"
  android:id="@+id/toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:popupTheme="@style/AppTheme.PopupOverlay"
  app:navigationIcon="?attr/homeAsUpIndicator"
  app:title="@string/app_name" 
  android:minHeight="@dimen/abc_action_bar_default_height_material" />

至少这对我起作用了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接