背景
app中显示时间电量等信息那位置称为状态栏,再往下部分称为标题栏目,标题栏之前一般是actionbar实现的,5.0之后google推出了toolbar来替代actionbar。最早大多数app的标题栏都是黑底白字,比如微信的大部分页面,但微信某些三级页面标题栏变成了灰底黑字。后来趋势是背景色为比较亮眼的颜色,字体为白色,比如支付宝的标题栏就是蓝底白字,嗯,我们的app也是这样的。现在趋势又变成白底黑字,淘宝京东也是这样的,于是设计也想把我们的app统一改成白底黑字的标题栏。
由于历史原因我们的标题蓝是用actionbar实现的,在清单文件中直接标注lable和theme属性来实现的
<activity
android:name=".activity.more.AddressBookActivity"
android:label="@string/delivery_address"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
主题AppTheme的各种属性
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<!--标题栏(actionBar)颜色-->
<item name="colorPrimary">@color/colorPrimary</item>
<!--状态栏颜色-->
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
改造之旅
于是我也尝试直接修改theme属性来实现将actionbar变为白底黑字,
<style name="myAppTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">@style/myActionBar</item> <!--设置ActionBarStyle-->
</style>
actionBarStyle改变ActionBar的背景颜色,
<style name="myActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#54BA42</item>
<item name="android:backgroundStacked">#54BA42</item>
<item name="android:titleTextStyle">@style/actionBarTitle</item> <!--设置titleTextStyle-->
</style>
titleTextStyle设置title的字体颜色和大小
<style name="actionBarTitle">
<item name="android:textColor">#333333</item>
<item name="android:textSize">20sp</item>
</style>
然而在我的测试机(api23)上的实际效果确是title看不见,仔细检查了下也试了直接将style中actionbar中tittle字体设置写在一起,但还在白底情况下看不见title,究其原因是title字体依旧是白色的,在白底情况下自然是看不到title的。后来我追踪了下我手机API23 theme style的代码,发现压根没有修改tittle颜色的属性。所以修改title颜色不生效 ?
其他尝试
过度实现方案是在activity中用html的方式设置title,html的font color属性设置想要的title字体颜色即可。这里说下在theme中通过stytle无法设置title字体颜色的,在activi
<style name="AppCompat_bg_white" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryDark">@color/white</item>
<item name="android:colorBackground">@color/default_background</item>
<!--<item name="android:textColorPrimary">@color/black3</item>-->
<!--<item name="android:textColor">@color/black3</item>-->
<item name="android:homeAsUpIndicator">@drawable/ic_black_back</item>
</style>
supportActionBar?.elevation = HardwareParameter.getOneDpToPx(this)
supportActionBar?.title = Html.fromHtml("<font color='#333333'>My Order</font>") //通过修改 theme 方式无法实现修改 title 字体颜色(也许是因为API23机型上有这问题)
//设置状态栏文字颜色及图标为深色
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
终极方案
通过style方式实现,parent="@style/Widget.AppCompat.ActionBar.Solid",否则类似上个方案那样无法实现的。
<style name="AppCompat.White" parent="AppCompat">
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryDark">@color/white</item>
<item name="android:homeAsUpIndicator">@drawable/ic_black_back</item>
<item name="colorAccent">@color/black3</item>
<item name="actionBarStyle">@style/BlackTitle</item>
</style>
<style name="BlackTitle" parent="@style/Widget.AppCompat.ActionBar.Solid">
<item name="titleTextStyle">@style/BlackTitleStyle</item>
<item name="elevation">1dp</item>
</style>
<style name="BlackTitleStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/black3</item>
</style>
思考
- 因为项目集成的是AppCompatActivity,对应的主题为parent="Theme.AppCompat.Light.DarkActionBar",如果直接在minifest中Theme会闪退。如果将此主题继承Theme.Holo或其子类,对应的继承自AppCompatActivity修改为继承activity,在按照常规方法在主题中修改是有效果的
- android5.0后推出的actionbar替代者toolbar,很好的能实现自定义标题栏的各种自定义。修改背景色和字体颜色等就都不是问题了,但是toolbar不能像actionbar一样直接在minifest的theme设置属性即可,而需要在layout或者activity代码中些,相比稍显复杂。
ps:欢迎交流,通过我这种html方式设置actionbar的title也是下下策,国际化问题也不是很好处理。actoinbar底部的一条分割线elevation如何实现?在style中是实现不了的,代码中倒是能实现?