在 android Q版本(10.0)之后,有一個forceDark功能赘那,它可以快速實現(xiàn)黑暗主題的功能窿克。
問題:存在一個菜單伪很,菜單底下的imagview在light模式下顯示正常,但是在dark模式下由于imageview的背景比較黑暗杂数,顯示不明顯宛畦,需要修復(fù)
解決辦法:在Attr下定義新的引用,在主題theme下定義引用的是哪部分的資源揍移,如:
<attr name ="{新的資源名}" format = "reference"/>
<item name = "{新的資源名}"> @drawable/{drawable文件下的資源}(light模式下的資源文件)
<item name = "{新的資源名}"> @drawable/{drawable文件下的資源}(dark模式下的資源文件)
最終在java文件中獲取資源文件的時候次和,直接使用引用名(新的資源名)獲取資源即可,系統(tǒng)會根據(jù)不同的模式獲取不同的資源那伐,對主題進行修改踏施。
以上解決辦法是針對于android10以下的版本進行操作的,對于android10以上的版本罕邀,直接引用資源畅形,只要系統(tǒng)配置好,無需使用引用名獲取資源诉探,直接使用資源文件名日熬,系統(tǒng)也會根據(jù)不同的主題使用不同的資源。
當(dāng)然如果想進行嘗試肾胯,那么就可以使用開始提到的forceDark功能竖席,在獲取控件布局文件資源的時候,對控件對象進行ForceDarkAllow屬性進行更改敬肚。
當(dāng)該屬性為false時毕荐,那么上述方法對資源文件進行不同模式下的引用(當(dāng)然也需要準(zhǔn)備不同模式下的資源文件),當(dāng)該屬性為true時艳馒,則系統(tǒng)會自動更新憎亚。
新的問題:有的控件只有一種state(只有l(wèi)ight和dark兩個資源文件),但是有的控件有兩種state(會存在四中資源文件),例如antionBar.setButton()方法中放入的是一個selector(兩種資源虽填,enable的false和true),而不是一種vertor(單一資源)曹动,那么無法進行引用操作斋日,背景無法看清
解決辦法:
那么只能對在獲取selector的地方對系統(tǒng)主題進行判斷(light or dark)如:
if ((getApplicationContext().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) !=0)
然后根據(jù)不同主題下獲取不同模式的資源即可解決問題。