6

因此,我有一個Android library,我希望其他人能夠在使用它時輕鬆自定義其顏色。問題在於顏色不僅僅是一個屬性(如視圖背景),而更像是主題顏色(視圖背景,文本顏色,按鈕的筆觸等等),所以我是無法將其作爲視圖屬性傳遞。所以我結束了使用color reference和風格,佈局和繪圖使用它:將默認顏色設置爲Android庫

colors.xml:

<resources> 
    <attr name="color" format="reference" /> 
</resources> 

layout.xml:

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="?attr/color"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="?attr/color"/> 
    <android.support.design.widget.TextInputLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:theme="@style/LibraryTheme.TextAppearance"/> 
</LinearLayout> 

styles.xml在庫項目:

<style name="LibraryTheme.TextAppearance"> 
    <item name="android:textColor">?attr/color</item> 
    <item name="colorControlNormal">?attr/color</item> 
    <item name="android:textColorHint">?attr/color</item> 
    <item name="colorControlActivated">?attr/color</item> 
    <item name="colorControlHighlight">?attr/color</item> 
</style> 

這很好,當有人使用我的庫他必須宣佈,他希望你在他的主題使用的顏色:

styles.xml在應用項目:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="color">@color/my_color</item> 
</style> 

問題是這樣的:我想用默認顏色方案提供這個庫。它現在可以執行2個選項:

  1. 聲明我自己的主題與默認顏色集,用戶將需要繼承他的主題從我的。
  2. 將一些default_color放在我的color.xml文件中,這樣用戶就可以使用它作爲他主題中的顏色。

第一個是非常糟糕的,因爲我不能強制用戶使用特定的應用程序主題(如AppCompact.Light)。 第二個也不是那麼好,因爲我希望用戶能夠無縫地使用默認設置,並且我需要設置主題中的幾種顏色。

有什麼其他的方式,你認爲我可以讓其他用戶輕鬆玩顏色?

謝謝。

+0

您可以檢查[SublimePicker(https://開頭的github .com/vikramkakkar/SublimePicker)項目的[主題](https://github.com/vikramkakkar/SublimePicker/blob/master/sublimepickerlibrary/src/main/res/values/themes.xml)設置。這是非常複雜的,因爲我不得不提供很多主題選項。從你的分類來看,這個設置將會在** 1 **之下,我想。 '第一個非常糟糕,因爲我不能強制用戶使用特定的應用程序主題(比如AppCopact.Light)'---不,你會要求用戶覆蓋_your_主題,比如'parent =「MyLibrarysDefaultTheme 「'。這沒關係。 – Vikram

+0

@Vikram看起來像你使用所有樣式屬性作爲單個屬性,並將它們設置在代碼中(如'iconColor'),如果我在多個地方都有顏色,而其中一些不能在代碼中設置,該怎麼辦? – shem

+1

您需要的是控制設置了哪些屬性,以及當它們不存在/無效時應該怎麼做。只有在您創建自定義組件時才能提供此控件。在你的特定情況下,你會檢查attr/color是否已經設置,如果沒有,使用默認值 - 在_runtime_。另一件你應該記住的事情是,你的產品的用戶(或者說客戶)將是開發者 - 而不是最終用戶。如果它不會從圖書館的核心功能中剔除任何東西,那麼強制要求是可以的。 – Vikram

回答

0

我不知道如果我正確明白了吧,但我猜你有以下選項:

<!-- Colors--> 
    <color name="color1">#55000000</color> 
    <color name="color2">#FFFFFF</color> 
    <color name="color3">#000000</color> 

,然後自定義模板:在strings.xml文件中是這樣

申報傳遞此引用的對象。如果用戶想改變所有的應用程序的顏色,他需要的只是String.xml

設置新值
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="@color/color1"/> 
+1

TextView是在圖書館,所以用戶不能把顏色那裏 – shem

+0

男人,我沒有得到你。您引用的這位用戶是程序員還是安裝了應用程序的人? –

+1

對不起,會試圖讓它更清楚 - 用戶是想要使用庫的程序員。但他唯一需要做的就是將放在他的佈局中(文本視圖,所有內容都在庫代碼中) – shem

0

我會堅持選擇1爲題材只是屬性的集合,我不t看你如何「強制」用戶繼承你的主題 - 他只需要提供屬性列表,加上他有一些工作開始...

+0

如果他是提供主題中的顏色的人,那麼它就是#2選項。 。 – shem

2

問題是,您正在使用顏色參考,在你的情況下,我會使用常規的顏色屬性 - 這些可以由colors.xml中的用戶覆蓋。

所以在你的資料庫項目:

colors.xml:

<resources> 
    <color name="color">#FFFFFF</color> 
</resources> 

layout.xml:

<LinearLayout 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/color"> 
      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/color"/> 
      <android.support.design.widget.TextInputLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:theme="@style/LibraryTheme.TextAppearance"/> 
</LinearLayout> 

styles.xml:

<style name="LibraryTheme.TextAppearance"> 
    <item name="android:textColor">@color/color</item> 
    <item name="colorControlNormal">@color/color</item> 
    <item name="android:textColorHint">@color/color</item> 
    <item name="colorControlActivated">@color/color</item> 
    <item name="colorControlHighlight">@color/color</item> 
</style> 

而且如果用戶想要使用不同的顏色S,他可以宣佈自己的色彩在他的應用程序的colors.xml:

<resources> 
    <color name="color">#000000</color> 
</resources> 
+0

非常感謝,顏色有點超出了應用程序資源文件中指定的顏色。 – ruselli