一般在设计 Activity 时,会设定 Activity 的主题,也就是套用某一个特定的 Theme。如果今天在启动 Activity 后,想要动态调整 App Bar 的背景颜色,可以在另外指定 Activity 所套用的 Theme 后,重新启动 Activity。然而,这样的程序只是为了换个颜色似乎有一点小题大作,所以在这篇文章中提供了另外一种不用重新启动 Activity 的方法。
由于在源代码中指定颜色值不是好习惯、不够弹性,所以示范的源代码会从指定的 Theme 中取出 colorPrimary 及 colorPrimaryDark 二项属性的内容,并分别套用到 App Bar 及 Status Bar。另外,示范的源代码使用的是衍生自 AppCompatActivity 的 Activity,所以在取得 Action Bar 的 Instance 时调用的是 getSupportActionBar()
。
完整的源代码如下:
private void changeActionBarColor(int inThemeId) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
String primaryColor = null;
String primaryColorDark = null;
primaryColor = this.getThemePrimaryColor(inThemeId);
primaryColorDark = this.getThemePrimaryColorDark(inThemeId);
if (primaryColor != null && primaryColor.length() > 0) {
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor(primaryColor)));
}
if (primaryColorDark != null && primaryColorDark.length() > 0) {
Window window = this.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(primaryColorDark));
}
}
}
private String getThemePrimaryColor(int inThemeId) {
String result;
int[] attrs = {R.attr.colorPrimary};
TypedArray typedArray = obtainStyledAttributes(inThemeId, attrs);
result = typedArray.getString(0);
typedArray.recycle();
return result;
}
private String getThemePrimaryColorDark(int inThemeId) {
String result;
int[] attrs = {R.attr.colorPrimaryDark};
TypedArray typedArray = obtainStyledAttributes(inThemeId, attrs);
result = typedArray.getString(0);
typedArray.recycle();
return result;
}
网友评论