注意:使用Android的支持庫v22.1.0和定位API級別11和最多?向下滾動到最後一次更新。
我的應用程序樣式設置爲Theme.Holo這是黑暗的,我會 像我的列表視圖中的複選框是風格Theme.Holo.Light的。 我不想創建自定義樣式。下面的代碼似乎並不是 工作,根本沒有任何反應。
起初,它可能並不明顯,爲什麼系統表現出這種行爲,但是當你真正地研究機制時,你很容易推斷出它。讓我一步一步帶你通過它。
首先,我們來看看Widget.Holo.Light.CompoundButton.CheckBox
風格的定義。爲了使事情更清楚,我還添加了「常規」(非淡)風格的定義。
<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />
正如您所看到的,兩者都是空聲明,它們只是以不同名稱包裝Widget.CompoundButton.CheckBox
。所以讓我們看看那個父母風格。
<style name="Widget.CompoundButton.CheckBox">
<item name="android:background">@android:drawable/btn_check_label_background</item>
<item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>
此樣式引用了背景和可繪製按鈕。 btn_check_label_background
只是一個9補丁,因此對於這個問題不是很有趣。但是,?android:attr/listChoiceIndicatorMultiple
表示基於當前主題(這對實現很重要)的某些屬性將決定CheckBox
的實際外觀。
由於listChoiceIndicatorMultiple
是一個主題屬性,您會發現它的多個聲明 - 每個主題一個(如果從父主題繼承,則爲none)。這將如下所示(爲了清楚省略了其他屬性):
<style name="Theme">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item>
...
</style>
<style name="Theme.Holo">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item>
...
</style>
<style name="Theme.Holo.Light" parent="Theme.Light">
<item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item>
...
</style>
所以這其中真正的魔術發生:基於主題的listChoiceIndicatorMultiple
屬性的CheckBox
的實際外觀來確定。你看到的現象現在很容易解釋:因爲外觀主題爲主(及不風格爲主,因爲這僅僅是一個空的定義),你是從Theme.Holo
繼承,你總是會得到CheckBox
外觀匹配主題。
現在,如果您想將您的CheckBox
的外觀更改爲Holo.Light版本,您需要將這些資源的副本,添加到您的本地資源並使用自定義樣式來應用它們。
至於你的第二個問題:
也可以,如果你設定一個風格的應用程序,你設置樣式個別部件?
當然,它們將覆蓋任何活動或應用程序集樣式。
是否有任何方法將主題(樣式與圖像)設置爲複選框 小部件。 (...)無論如何要使用這個選擇器:link?
更新:
讓我開始再次說,你不應該依賴於Android的內部資源。你不能隨意訪問內部命名空間,這是有原因的。
不過,畢竟來訪問系統資源的方式是由名做一個ID查找。請看下面的代碼片段:
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
第一行實際上將返回btn_check_holo_light
繪製資源的資源ID。由於我們之前建立的這個按鈕選擇器決定了CheckBox
的外觀,我們可以將它設置爲widget上的「可繪製按鈕」。其結果是CheckBox
用的Holo.Light
版本的外觀,無論你在XML應用程序,活動或插件設置什麼主題/風格。由於這隻設置可繪製按鈕,因此您需要手動更改其他樣式;例如關於文字外觀。
下面示出的結果的屏幕截圖。頂部複選框使用上述方法(我手動將文本顏色設置爲xml黑色),而第二個複選框使用基於主題的默認主題Holo
樣式(即不亮)。
UPDATE2:
隨着the introduction of Support Library v22.1.0,事情剛變得更簡單了!從發行說明引號(我的重點):
棒棒糖添加通過視圖級別使用android:theme
XML屬性覆蓋的主題在視圖的能力 - 的東西非常有用,例如在輕微活動暗動作條。現在,AppCompat允許您爲工具欄使用android:theme
(不贊成使用先前使用的app:theme
),並且甚至更好地爲支持API 11+設備上的所有視圖。
換句話說:你現在可以在按次基礎,這使得解決原來的問題容易得多上應用主題:只要指定的主題,你想申請相關視圖。即在原來的問題的情況下,比較的下面的結果:
<CheckBox
...
android:theme="@android:style/Theme.Holo" />
<CheckBox
...
android:theme="@android:style/Theme.Holo.Light" />
第一CheckBox
彷彿在黑暗的主題使用的樣式,第二彷彿在光的主題,而不管實際的主題的設定爲你的活動或應用程序。
當然,你不應該再使用Holo主題,而是使用Material。
感謝您花時間回覆。我在這裏看到了這個問題,我仍然想知道這是否可以在我不必做大量工作的情況下完成。有什麼方法可以將主題(包含圖像的樣式)設置爲複選框小部件。我知道我可以找到這些圖像並將它們包含在我的項目中,但它看起來像是在殺人。無論如何使用這個選擇器:https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_check_holo_light.xml – user1330739 2012-04-16 05:53:26
@ user1330739:是的,沒有。您不應該依賴內部資源,因爲Google可能會決定在未來的版本中更改它們。在您的本地資源中包含可繪製副本實際上是您的最佳選擇。話雖如此,我還知道另一種(醜陋的)解決方案,但它只在運行時才起作用(這意味着您無法在xml文件中引用它)。請參閱上面對我的回答的編輯。 – 2012-04-16 10:54:21
@MH。做得好。 – 2015-07-28 23:57:17