2013-06-24 115 views
6

我正在開發一個應用程序,將以不同的客戶端的不同顏色和圖像爲主題。雖然我可以選擇在構建時使用自定義顏色重新編寫colors.xml文件,但我傾向於在運行時設置顏色。我想知道的是,如果這是以某種方式通過編程方式更改colors.xml文件中定義的顏色的值,並讓該新值在佈局定義中使用的所有位置生效。如何以編程方式更改colors.xml中的顏色值?

因此,換句話說,如果我有:

<?xml version="1.0" encoding="UTF-8"?> 
<resources> 
    <color headerColor="white">#FFF</color> 
    <color backgroundColor="black">#000</color> 
</resources> 

並且用類似的佈局文件:

<TextView 
     android:id="@+id/listItemHeaderActivity" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="12sp" 
     android:textColor="@color/headerColor" 
     android:background="@color/backgroundColor" 
     android:text="@string/listTextHeaderActivity"/> 

我可以改變的headercolor Java中的價值和backgroundColor,並讓它發生在所有使用這些值的視圖中?或者當我顯示這些視圖時,是否必須單獨更改每個相關的視圖顏色?

在此先感謝。

+1

你試過了什麼? – koem

+0

在這一點上,我沒有真正嘗試過除定義某些默認顏色值並在佈局文件中使用它們之外的任何其他內容,如上所示。正如我在我的問題中所描述的,我一直無法找到解決方法,所以我還沒有嘗試過這樣的事情。 – RocketGuy3

+1

不,你不能改變。您可以使用sharedpreferences來保存顏色並使用它們。 – Tarun

回答

1

如果你描述了爲什麼以及如何使用這種動態顏色,以及爲什麼要在運行時而不是構建時間這樣做,這將有所幫助。但假設它必須是你問的方式...

我建議寫一個幫助函數,所有的地方可以調用和設置它們。

public int getMyColor(...) { 
    // figure out which color to use, via a database call, 
    // an asset load, some algorithm, or whatever you need 
    ... 

    // once color chosen, create an RGBA integer for it 
    final int myColor = ... 

    return myColor; 
} 

立即調用此對每個活動/分段需要它,並根據需要在適當的觀點設置的顏色屬性(一個或多個)。 (使用View.setBackgroundColor(...)等)

但是,要使其在XML設置和/或開發佈局預覽中工作,您必須編寫自定義視圖類來調用該輔助函數。根據你在哪裏以及如何使用這種顏色,它可能不值得。

這個解決方案不是很優雅,需要在每個需要它的活動/片段中調用這個自定義的getMyColor幫助器函數。如果它只設置了一兩個地方,這可能不是什麼大不了的事情。再次,知道爲什麼你想這樣做,而不是問我們如何去做,可能會產生一個更好的選擇。

例如,這不是你的問題的答案,但你有沒有想過主題?除非你想要所有上述內容,否則它仍然會遇到必須在構建時設置它們的問題,但根據你使用這種顏色的方式,它可能比上面列出的混亂更好。

+0

我們的團隊決定我們不想在構建時這樣做,因爲他們不喜歡有點混亂的腳本,複製colors.xml文件中的顏色值。此外,我們希望配置儘可能獨立於構建,以便我們唯一需要提供的是商家設置文件。 – RocketGuy3

+1

您可以將大部分應用視爲共享庫,然後讓「真實」應用的每個商家實例覆蓋colors.xml文件。有關更多信息,請參閱http://developer.android.com/tools/projects/index.html#LibraryProjects。那最終需要的不僅僅是'一個商家設置文件',而是要解決這個問題,併成爲每個Android SDK設計的'支持'解決方案。 –

0

我最終做了一些與Jon Jon可能描述的東西有點相似的東西。我創建了一個擴展Fragment的類(或者我的例子中的SherlockFragment)。該類有一個名爲「setCustomColors」的新方法,它只接受片段視圖並在其所有子項中搜索需要自定義的某些類型的視圖。然後,我爲所有片段擴展該類,並在onCreateView方法中調用該函數,傳入當前片段視圖。讓我知道這個解釋是不是很清楚(儘管這可能不是很多人會遇到的問題)。

相關問題