如何使用AppCompat样式在代码中修改ActionBar标题颜色?
解决ActionBar标题颜色修改问题
嘿,我来帮你搞定这个ActionBar标题颜色的事儿!先给你说代码修改的方案,再解释为啥你之前XML里改不了~
一、用代码动态修改ActionBar标题颜色
因为你的主题是Theme.AppCompat.Light.DarkActionBar,记得要用getSupportActionBar()(而不是原生的getActionBar())来操作,下面给你两种常用方法:
方法1:用SpannableString设置颜色
这是最简单的方式,不需要额外布局:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { // 把标题转成SpannableString,给它设置颜色 SpannableString spannableTitle = new SpannableString(actionBar.getTitle()); // 这里换成你想要的颜色,比如Color.GREEN或者自定义色值 spannableTitle.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); actionBar.setTitle(spannableTitle); } }
如果你用Kotlin的话,代码更简洁:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) supportActionBar?.let { actionBar -> val spannableTitle = SpannableString(actionBar.title) spannableTitle.setSpan(ForegroundColorSpan(Color.RED), 0, spannableTitle.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE) actionBar.title = spannableTitle } }
方法2:自定义ActionBar布局(更灵活)
如果需要更复杂的标题样式(比如加图标、调整字体大小),可以自定义布局:
- 先创建
res/layout/custom_actionbar.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_actionbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" android:textColor="#FF0000" <!-- 这里可以先设默认色,也能代码动态改 --> android:layout_gravity="center"/>
- 然后在Activity里设置自定义ActionBar:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { // 关闭默认标题,启用自定义布局 actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); LayoutInflater inflater = LayoutInflater.from(this); View customActionBarView = inflater.inflate(R.layout.custom_actionbar, null); TextView titleTv = customActionBarView.findViewById(R.id.tv_actionbar_title); // 设置标题文本和颜色 titleTv.setText("我的自定义标题"); titleTv.setTextColor(Color.BLUE); // 动态改颜色 actionBar.setCustomView(customActionBarView); } }
二、为啥你之前XML里修改没生效?
看你的AppTheme里设置了android:textColorPrimary,但这个属性不会直接影响ActionBar的标题颜色——因为你用的是Theme.AppCompat.Light.DarkActionBar,这个主题的ActionBar本身用的是一个子主题(ThemeOverlay.AppCompat.Dark.ActionBar),标题颜色是由这个子主题里的titleTextColor控制的。
如果想在XML里直接修改ActionBar标题颜色,需要给主题添加actionBarTheme属性:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:colorPrimary">#3f51b5</item> <item name="colorPrimary">#3f51b5</item> <!-- 添加这个属性,指定ActionBar的子主题 --> <item name="actionBarTheme">@style/CustomActionBarTheme</item> </style> <!-- 自定义ActionBar的子主题 --> <style name="CustomActionBarTheme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <!-- 兼容Android原生和AppCompat库,两个属性都加上 --> <item name="android:titleTextColor">#FF0000</item> <item name="titleTextColor">#FF0000</item> </style>
这样设置后,ActionBar的标题颜色就会变成你指定的红色啦~
内容的提问来源于stack exchange,提问作者Artur A
相关产品推荐
相关产品推荐

