2012-04-13 55 views
35

我是新來的android和我試圖設置一個樣式到我的應用程序中的所有複選框。我的應用程序樣式設置爲Theme.Holo,它是黑暗的,我希望列表視圖上的複選框具有樣式Theme.Holo.Light。我不想創建自定義樣式。下面的代碼似乎不起作用,根本沒有任何反應。我需要這樣做,因爲我的列表視圖有一個輕型紙張紋理,複選框和複選框文本是白色的,我想黑暗。Android複選框風格

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> 
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> 
</style> 

<style name="customCheckBoxStyle" parent="@android:style/Widget.Holo.Light.CompoundButton.CheckBox"> 
</style> 

如果您將樣式設置爲應用程序,還可以將樣式設置爲單個小部件嗎?

回答

52

也許這將滿足你 -

something.xml

<CheckBox 
    android:text="Custom CheckBox" 
    android:button="@drawable/checkbox_selector" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

選擇

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:drawable="@drawable/star_down" /> 
    <item android:state_checked="false" android:drawable="@drawable/star" /> 
</selector> 

爲,參考只是指here

0

在以前的答案也在部分<selector>...</selector>您可能需要:

<item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item> 
108

注意:使用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樣式(即不亮)。

Screenshot showing the result


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。

+0

感謝您花時間回覆。我在這裏看到了這個問題,我仍然想知道這是否可以在我不必做大量工作的情況下完成。有什麼方法可以將主題(包含圖像的樣式)設置爲複選框小部件。我知道我可以找到這些圖像並將它們包含在我的項目中,但它看起來像是在殺人。無論如何使用這個選擇器: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

+2

@ user1330739:是的,沒有。您不應該依賴內部資源,因爲Google可能會決定在未來的版本中更改它們。在您的本地資源中包含可繪製副本實際上是您的最佳選擇。話雖如此,我還知道另一種(醜陋的)解決方案,但它只在運行時才起作用(這意味着您無法在xml文件中引用它)。請參閱上面對我的回答的編輯。 – 2012-04-16 10:54:21

+0

@MH。做得好。 – 2015-07-28 23:57:17

4

也許你想要的東西,如:

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> 
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> 
</style> 

<style name="customCheckBoxStyle" parent="@android:style/Widget.CompoundButton.CheckBox"> 
    <item name="android:textColor">@android:color/black</item> 
</style> 

注意,文字顏色項目。

14

做物料設計正確的方法是:

風格:

<style name="MyCheckBox" parent="Theme.AppCompat.Light"> 
    <item name="colorControlNormal">@color/foo</item> 
    <item name="colorControlActivated">@color/bar</item> 
</style> 

佈局:

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:text="Check Box" 
    android:theme="@style/MyCheckBox"/> 

它會保留在棒棒堂+材質動畫。