在Android中,要使colorPrimary
動態變化,可以通過編程方式更改主題屬性或者使用ColorStateList
來實現。以下是兩種實現方法:
方法1:編程方式更改主題屬性
在代碼中,你可以通過以下步驟動態更改colorPrimary
:
TypedArray typedArray = getTheme().obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
int colorPrimary = typedArray.getColor(0, 0);
typedArray.recycle();
colorPrimary
值:int newColorPrimary = getResources().getColor(R.color.new_color_primary);
colorPrimary
值:TypedArray typedArray = getTheme().obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
typedArray.setColor(0, newColorPrimary);
setTheme(getTheme()); // 應用新的主題
typedArray.recycle();
方法2:使用ColorStateList
ColorStateList
對象,定義不同狀態的顏色:ColorStateList colorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_enabled}, // 狀態為enabled時的顏色
new int[]{-android.R.attr.state_enabled} // 狀態為not enabled時的顏色
},
new int[]{
ContextCompat.getColor(this, R.color.color_primary_enabled), // 狀態為enabled時的顏色值
ContextCompat.getColor(this, R.color.color_primary_not_enabled) // 狀態為not enabled時的顏色值
}
);
ColorStateList
到colorPrimary
:setTheme(new Theme().applyStyle(R.style.AppTheme, true));
TypedArray typedArray = getTheme().obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
typedArray.setColor(0, colorStateList.getDefaultColor());
setTheme(getTheme()); // 應用新的主題
typedArray.recycle();
這樣,colorPrimary
就可以根據狀態動態變化了。注意,這些方法需要在主線程中執行。