2015-10-01 50 views
1

將顏色定義爲int常量並在每次需要時將它們從xml中拉出來靜態訪問它們時是否有任何缺陷?在Java文件中定義顏色常量而不是xml

例如,假設我定義了一個名爲AppColors類:

public final class AppColors { 

    private AppColors() { throw new AssertionError(); } 

    public static final int COLOR_RED_500 = 0xFFF44336; 

} 

而且隨着AppColors.COLOR_RED_500訪問顏色,而通常的路線是getResources().getColor(R.color.red_500)

除了一個事實,即顏色很可能需要在xml佈局/主題被定義兩次,一次又一次的代碼,以這種方式定義顏色將有不需要重複getResources()電話的優勢和需要將Context參數傳遞給不從Context類繼承的類的方法和構造函數。

+0

實際上製作對'getResources()'的調用需要特定類的'context',所以可能通過'getresources()。getColor()'訪問顏色比訪問它作爲'YourColorClass.colorName'稍微重要,但訪問時間或資源的差異可以忽略不計。 – Apurva

回答

0

最好檢查一下是否適合您的需求,但這裏有一些反對意見。

  1. 你在你的問題中列出了主要論點,關於定義它 兩次。
  2. 您可以覆蓋不同的值的彩色文件 如果你需要的話,例如不同的顏色不同 語言,屏幕方向等
  3. 您可以使用在佈局個XML的顏色。

要了解更多關於此主題的信息,請閱讀:http://developer.android.com/guide/topics/resources/overview.html

+0

我沒有考慮過爲不同的配置(方向等)創建不同的'color'' xml'文件所帶來的好處。我認爲你的文章涵蓋了主要優點/缺點。 – PPartisan

1

實際上沒有爲此定義的約定。


其中最重要在這個情況下是

  • 清晰度
  • 性能
  • 可擴展性

如果,你的情況,該刪除的聲明副本,使你的代碼更清晰,不影響性能,是的,你可以並且必須使用它

但請注意:這不是一個一般的規則,你必須單獨analize每種情況下,決定在刀刃上,對於其他情況下,使用AppColors類可以創建,而不是使用數據庫表duplicities或性能問題(如果很多請求)。

+0

您是否認爲向常量發出很多請求可能會導致性能問題?你能擴展嗎? – PPartisan

+0

不,我的意思是在dabase上有很多請求,如果你的應用使用數據庫發出多個請求,那麼這些請求可能會降低性能......實際上,在這種情況下,靜態類將被實例化一次,並且訪問常量的速度會更快。 –

+0

通常,如果我必須多次訪問數據庫表,我填充Java對象以便提高遠程連接的性能和數據傳輸。 –

1

不,完全取決於你在哪裏定義顏色。將它們保留在xml中的優點是,您也可以在xml佈局/主題中使用這些顏色。

如:

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@color/color_red_500" /> 

如果你厭倦了傳遞Context提取的顏色,我會建議你有一個靜態的單實例爲您Application

如:

public class MyApplication extends Application { 
    private static MyApplication instance; 

    public static MyApplication getInstance() { 
     return instance; 
    } 

    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 
} 

然後用它像MyApplication.getInstance().getResources().getColor(R.color.red_500);

+0

不錯的建議,是的,問題的一部分實際上是通過'Context'所需的代碼量,然後將每種顏色存儲在一個變量中,等等。以這種方式訪問​​實例將加速該過程。 – PPartisan

相關問題