2016/10/28

如何在 Drawable 的 Selector 中使用 Theme 所定義的 Color 值

在最新的 Android 版本中提供了一項方便的功能,可以指定 Theme 中定義好的顏色到 Layout 中的對應 Attribute。例如:在 Theme 中會定義 android:colorPrimary 來代表主要的顏色,此時可以指定 TextView 的 textColor 為 "?android:attr/colorPrimary”,則 Text 的顏色就會呈現 colorPrimary 所設定的數值。當 Theme 的 colorPrimary 更改時,TextView 上的 Text 顏色也會隨之修正。

不過這並不是這個功能的優勢,在 textColor 中指定 “@color/primary”,再透過修改預先在 res/values/colors.xml 中定義的顏色也可以達到同樣的效果。這項功能最主要的好處是 textColor 會隨著所在的 Theme 而呈現不同的顏色值。如果有一個 Layout 含有上述的 TextView,且在不同的 Activity 間共用,但每一個 Activity 都有指定自己專屬的 Theme。此時,例子中 TextView 上的文字顏色在不同的 Activity 上就會隨著 Theme 而改變,甚至是啟動 Activity 前另外指定 Theme 也會讓 textColor 隨之不同。

這也就是為什麼在最新的 SDK 中呼叫特定的函式時,都會被建議要加上 Theme 的參數。因為在 Layout 中有可能指定 Theme 中某一個內容,如果沒有一併指定 Theme 時,會造成這些資訊沒有辦法取得而出現問題。

如果想要讓 View 在不同的 State 中顯示不一樣的顏色可以使用 ColorStateList 的 Selector 來達成效果。但對 android:background 的 Attribute 不適用,在 android:background 中要指定 Drawable 類型的資源。最直接的方法就是同樣的 Selector 檔案移到 res/drawable 路徑下,原本的內容中 android:color 要改成 android:drawable。

只不過此時會有一個惱人的問題出現,在使用 android:drawable 時沒有辦法以 ?android:attr 的方式來指定 Theme 中所定義的顏色。這下就有點傷腦筋了,豈不是要回復到之前每一個 Theme 都要建立一組 Selector 的麻煩方式。同時,在某些情況下要用程式指定 Selector 時還要先判斷目前的 Theme 來決定產生的 Instance,平白多打很多的程式碼。

所幸,經過上網查詢之後找到了解決的方法,可以將 Selector 改用以下的方式替代:





2016/9/22

軟體的盈利模式

當辛辛苦苦開發好一個應用程式、一套系統,如果想要期望這個軟體能夠養家活口、甚至是榮華富貴,就必須要思考一個問題:如何向使用者收錢?

軟體可以收錢的模式,大致可分為幾種類型:
  • 依功能計價
  • 依資料容量計價
  • 依使用人數計價
  • 依使用時間計價
  • 依內容與服務計價

2016/8/4

如何使用程式更改 Activity 中 App Bar 的背景顏色

一般在設計 Activity 時,會設定 Activity 的佈景主題,也就是套用某一個特定的 Theme。如果今天在啟動 Activity 後想要動態調整 App Bar 的背景顏色,可以在另外指定 Activity 所套用的 Theme 後重新啟動 Activity。然而,這樣的程序只是為了換個顏色似乎有一點小題大作,所以在這篇文章中提供了另外一種不用重新啟動 Activity 的方法。

2016/7/29

在可收合的 App Bar 中加入 Subtitle

可收合的 App Bar (以前叫 Action Bar 後來又一度改成 Tool Bar) 是 Android 平台上新推出的 Material Design 效果。要在開發的 App 中使用這個效果並不難,只要在最新的 Android Studio 中,於新增 Activity 時選擇【File -> New -> Activity -> Scrolling Activity】,並依照「Configure Activity」視窗的欄位填好內容,按下【Finish】按鈕,就可以有一個執行起來如下圖的畫面,頗為無腦。

2016/7/17

解析 Android 開發時的 SDK 版本參數設定

在開發 Android App 時,開發人員最容易出現困惑的地方之一應該是 compileSdkVersion、minSdkVersion 和 targetSdkVersion 這些參數的用途。對此,有 Google 內部的 Android 開發人員就這個議題寫了一篇文章:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion。在這裡會用不同的角度來說明這些參數的用途,希望能對大家在應用上有所幫助。

2016/6/25

行動裝置的資料存取選項

今天如果是要開發一個在行動平台上的應用程式,應用程式的功能要夠豐富,就勢必得牽涉到資料存取的議題。否則使用者在操作程式時,就如同和海底總動員的 Dory 對話一般,每次開啟程式都只能反覆地進行基本的作業、無法累積操作狀態的資訊。

2016/5/30

使用 PMP 的 EVM 追蹤軟體開發進度

軟體開發在追蹤上的難題

一般在企業內部要開始一個軟體開發的專案有很多時候是老闆忽然靈機一動地問說:「我們來開發一個某某系統,你覺得需要多久?」有經驗的人聽到這個問題時就知道這是考驗專業能力與政治敏感度的時刻,因為這是一個兩難的問題。在好傻好天真的時期會想:「天啊!系統要做到什麼程度、有多少人參與、要給多少資源都還沒確定,就要押完成日?」會有這樣的想法不意外,就像是要蓋一個房子,連要蓋幾層都不確定、設計圖都還沒畫,更別提建材和工人都還沒有著落的情況下就要問何時入住,回答得出來才有鬼!