太牛了!Android 樣式系統 主題背景屬性

2021-10-10 15:45:41 字數 2395 閱讀 2987

想要成為一名優秀的android開發,你需要乙份完備的 知識體系,在這裡,讓我們一起成長為自己所想的那樣~。

這會讓我們通過建立更少的布局或樣式,以隔離主題背景中的修改。在實際開發中,您通常希望根據主題背景改變顏色,因此您應該始終通過主題背景屬性來引用顏色。這意味著您可以將如下**視為有**異味 (code smell):

相反,您應該使用主題背景屬性,它允許您按主題更改顏色,例如,在深色主題中提供乙個不同的值:

即使您當前不支援其他主題 (什麼,您的應用還沒有支援深色主題?),我們依然建議您採用這種方法,因為這樣會讓新主題的採用變得更加簡單。

合格的 colors 檔案

您可以通過在不同的配置中新增不同的值來改變顏色 (例如,在 res/values/colors.xml 中和在 res/values-night/colors.xml 中的備選值裡均定義 @color/foo),但我們依然建議您使用主題背景屬性來替代它們。對顏色層級的區分,會迫使您給顏色賦予語義化名稱,換句話說,您應該不會在給顏色命名為 @color/white 的同時,又為深色模式提供乙個深色變體,這會讓人感到非常困惑。所以,您可能會想要使用乙個語義化名稱,例如 @color/background。這種方法帶來的問題是它合併了顏色宣告和具體的值,因此,它並沒有指出顏色是可以或者能夠隨主題背景而變化的。@colors 的變化也會鼓勵您創造更多顏色。如果在不同的情境下要使用具有相同值的、新的語義化命名的顏色 (即,不是背景色但應該使用相同顏色),這時候您仍需要在 colors 檔案中建立新的條目。通過使用主題背景屬性,我們可以將語義顏色的宣告從提供它們的值中區分開來,而且讓使用方更清楚地了解到顏色會隨主題背景而變化 (因為它們使用 ?attr/ 語法)。將顏色宣告保持為字面值,您就可以自定義應用使用的顏色調色盤,並在主題背景級別修改它們,這會讓 color.xml 較小且易維護。這種方法的額外好處是,布局/樣式引用這些顏色時復用性變得更高。由於主題背景可以被覆蓋或者改變,因此這間接表示: 您不需要建立其他布局或樣式就可以更改某些顏色——您可以在相同的布局中使用不同的主題背景。

始終使用?

在某些情況下,您或許不想按照主題背景更改顏色。例如,在 material design 規範文件中提到,您可能希望在淺色和深色主題中均使用同一型別的顏色。

在這種特殊情況下,直接引用顏色資源是再合適不過的:

當前發展狀況

當使用 colorstatelists 時,您可能也不會在您的布局/樣式中直接引用主題背景屬性。

如果 primary_20 是乙個 colorstatelist,它本身引用主題背景屬性來獲取色值也可能是合理的 (請參見下文)。colorstatelists 通常為不同的狀態 (按下,禁用等) 提供不同的顏色,但它還有另外一種可用於主題化功能您可在選取的顏色上指定透明度值:

這種單項 colorstatelist (即只提供單個預設顏色,而非每種狀態的不同顏色) 有助於減少您需要維護的顏色資源數量。它並沒有定義乙個新的顏色資源的方式來手動為您 (每乙個配置檔案) 的 primary 顏色設定 alpha 值,而是通過改變當前主題背景中的 colorprimary 的方式。如果您的原始顏色發生了變化,則只需要在乙個地方進行更新,無需調整所有已更新的地方。

雖然此技術很有用,但仍有一些注意事項:

1. 如果指定的顏色也具有 alpha 值,則 alpha 會被合併。例如,將 50% 的 alpha 應用於 50% 的不透明白色中,將產生 25% 的白色:

3. 通常,我們使用簡寫法,將顏色設定為 drawable,例如:

view 的背景是乙個 drawable,此簡寫把給定的顏色強轉成了乙個 colordrawable。但是沒有辦法把 colorstatelist 轉換成 drawable (api 29 之前使用 colorstatelistdrawable 解決這個問題)。

但是,我們可以通過迂迴的方式繞過此限制:

請確保您的 backgroundtint 支援您的 view 所需的狀態,例如,如果被禁用時需要更改。

強制執行

即使您已經說服自己使用主題背景屬性和 colorstatelist,但如何在**庫或者團隊中使用呢?您可以在 code review 期間嘗試保持警惕,但它的擴充套件性不是很好。更好的方法是依靠工具來解決此問題。

《****** android lint theme aware》這篇文章簡述了如何通過新增 lint 檢查來尋找直接引用顏色的用法,並涵蓋了文中提及到的所有建議。

間接使用

本文在開源專案: 中已收錄,裡面包含不同方向的自學程式設計路線、面試題集合/面經、及系列技術文章等,資源持續更新中…

現在的學生,太牛B了。。。。。

以前沒畢業的時候跟大學一女生一起找單位實習。當時我進了一家比較大的軟體公司實習。做delphi。當時情況是不給薪水包吃包住吧。當時跟那女生說了一下,那女生直接賊bs。說沒薪水去個屁啊。當時我就無語了。我也沒管。就想著你牛b的話你在這p大點落後的地方找個比我公司好又有錢拿的公司實習。我倒不是說沒有這樣...

Android系統自帶樣式

android theme android style theme.dialog activity顯示為對話方塊模式 android theme android style theme.notitlebar 不顯示應用程式標題欄 android theme android style theme.n...

計算方法太牛了,留著以後教孩子!!

1.十幾乘十幾 口訣 頭乘頭,尾加尾,尾乘尾。例 12 14 解 1 1 1 12 14 168 注 個位相乘,不夠兩位數要用0佔位。頭相同,尾互補 尾相加等於10 口訣 乙個頭加 後,頭乘頭,尾乘尾。例 23 27 解 21 23 27 621 注 個位相乘,不夠兩位數要用0佔位。第乙個乘數互補,...