Android一個小知識點: 多個介面同時使用一個資源佈局的時候,修改背景需要注意的坑
需求是將系統中底部的白色背景改成黑色背景
=》
查詢工程看底部呼叫的程式碼是公共程式碼位於,
idh.code\vendor\sprd\platform\frameworks\support\featurebar\*
於是將color由white修改為black,以為就好了.結果發現大部分介面如預期都好了,可是桌面部分應用底部顯示還是白色,錄音機應用顯示為半灰色。查詢程式碼發現這些問題介面中並未對此背景進行二次設定color,再這些介面重新設定color又好了,百思不得其解.......
今天查詢了一天原因,終於從這個坑裡面拔出來了……
原因是
android中從同一個資原始檔中載入出來的drawable會共享狀態,如果你載入出來多個drawable,當改變了其中一個的狀態時,其他drawable的狀態也會相應改變。
在待機桌面介面的時候,對底部的背景alpha進行了修改:
FeatureBarUtil.setBackgroundAlpha(mFeatureBarHelper,
Math.round(255 * (visible ? mSoftBarAlpha : 1.0f)));
public static void setBackgroundAlpha(FeatureBarHelper fbh, int alpha) {
Drawable bg = getBackground(fbh);
if (bg != null) {
bg.setAlpha(alpha);
}
}
解決方案:
方案解釋:
/**
* Make this drawable mutable. This operation cannot be reversed. A mutable
* drawable is guaranteed to not share its state with any other drawable.
* This is especially useful when you need to modify properties of drawables
* loaded from resources. By default, all drawables instances loaded from
* the same resource share a common state; if you modify the state of one
* instance, all the other instances will receive the same modification.
*
* Calling this method on a mutable Drawable will have no effect.
*
* @return This drawable.
* @see ConstantState
* @see #getConstantState()
*/
public Drawable mutate() {
return this;
}
翻譯過來就是:
使這個drawable變得狀態不定。這個操作不能還原(變為不定後就不能變為原來的狀態)。一個狀態不定的drawable可以保證它不與其他任何一個drawabe共享它的狀態。這對於你需要更改從同一資源載入來的drawable的屬性時非常有用。
預設情況下,所有的從同一資源(R.drawable.XXX)載入來的drawable例項都共享一個共用的狀態,如果你更改一個例項的狀態,其他所有的例項都會收到相同的通知。
這個方法對於已經是mutable的drawable沒有效果。
相關文章
- 使用各類BeanUtils的時候,切記注意這個坑!Bean
- android同時使用多個library時的問題Android
- 每日一個知識點:什麼時候會觸發Full GCGC
- android studio的一個方便的技能,同時他也是坑Android
- 用Unity做個遊戲(一) - 建立專案時需要注意的點Unity遊戲
- 除錯使用了函式模組的程式時需要注意的一個小問題除錯函式
- 一個任務代辦的定時提醒應該需要掌握哪些知識點?
- golang split需要注意的一個點Golang
- 使用entity bean時候的一個問題?helpBean
- 多個DW同時更新,且表中有關係存在,需要注意的擊點問題。 (轉)
- 當我們開發一個介面時需要注意些什麼
- 一個常用的佈局
- 一行命令同時修改maven專案中多個mudule的版本號Maven
- DBA接手一個資料庫時候需要檢查的資料及步驟資料庫
- JAVA 兩個類同時實現同一個介面的方法Java
- 如何一臺機器同時使用多個git祕鑰Git
- 氣泡排序的改進:一次同時冒一個大泡,一個小泡排序
- 使用PowerBuilder同時訪問多個資料庫UI資料庫
- 學習openresty時,nginx的一個坑RESTNginx
- 昨天講課時整理的幾個知識點
- 使用regulator_get時的一個小注意事項
- 微信小程式開發需要注意的29個坑微信小程式
- 微信小程式開發需要注意的30個坑微信小程式
- 關於range的一個知識點
- listView中多個listItem佈局時,convertView快取及使用View快取
- video.js 一個頁面同時播放多個視訊IDEJS
- 一臺機器同時執行兩個或多個tomcatTomcat
- 使用sql*plus時的一個安全小問題SQL
- 關於 JavaScript 字串的一個小知識JavaScript字串
- Golang Recover的一個小坑Golang
- 小程式canvas的一個坑Canvas
- Android 實現一個通用的圓角佈局Android
- C#基本型別使用時的幾個注意點C#型別
- 記一個滑鼠略過時候的css動畫CSS動畫
- 開發微信公眾號遇到的一個坑,只因一個字母 s ,我浪費了 5 個小時
- adb 可以多個視窗同時連線一個裝置嗎?
- RAC 一個節點,5個小時產生了70多個G的trace ,把oracle目錄撐滿了Oracle
- 掌握一個事物時所需要學會的