看板 AndroidDev 關於我們 聯絡資訊
我在 color.xml 裡設定了幾個主要色系以及文字顏色 然後套用在其他 layout.xml 以及 drawable.xml 裡面 但是我現在突然要做一個切換色系的功能 大概需要切換五種色系 色碼都有了 每種色系要改五種顏色(三種主色 + 兩種字體顏色) 因為之前沒做過 加上我有些顏色都已經直接寫在 layout.xml 或 drawable.xml 裡面了 類似這樣: <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/main_color" android:textSize="20sp" /> 或是: <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/main_color" android:state_pressed="true" /> <item android:drawable="@color/sub_color" /> </selector> 我試過 ColorDrawable 不過似乎無法更改 layout.xml 或 drawable.xml 內部的顏色 這裡該怎麼改呢? 或是有其他改法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.222.191.73 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1505883053.A.119.html
paulku: textview設ID ex textviewTarget 09/20 13:12
paulku: ((TextView)findViewById(R.id.textviewTarget)).setTextC 09/20 13:13
paulku: (接上) .setTextColor() 09/20 13:14
paulku: 這樣就可以了 很簡易 09/20 13:14
gcobc12632: 我是要改整個APP內的顏色(切換色系) 09/20 13:20
gcobc12632: 應該說是切換樣式那樣… 09/20 13:21
benntqoo: 寫theme設定不同主題的顏色檔 09/20 14:14
benntqoo: 可以大方向的更改整個app 09/20 14:14
gcobc12632: 寫theme的話可以連xml內的設定都一起更改嗎? 09/20 14:16
benntqoo: 應該可以試著寫對應的style搭配theme更改整個顏色不要寫 09/20 14:18
benntqoo: 死顏色更換在程式碼中 09/20 14:18
benntqoo: 應該可以達到換顏色的效果 09/20 14:18
benntqoo: 不確定是不是最佳解,功有點多 09/20 14:18
benntqoo: 你要的功能應該是類似這樣 09/20 14:23
benntqoo: https://goo.gl/bjGicU 09/20 14:23
benntqoo: 但是特定textView顏色可能要額外處理 09/20 14:23
gcobc12632: 樓上那個網頁的方法…有看沒有懂 我程式功力還太弱了 09/20 17:33
後來用了另一種方法:直接多寫好幾個 layout(layout1.xml、layout2.xml…) 每個 layout 再套用自己的配色 然後在 setContentView 的地方做切換 雖然挺蠢的 不過以我的能力來講這大概是比較好的方法了…  
ssccg: Theme的寫法是xml(layout、drawable...)用到顏色的地方都必 09/21 15:14
ssccg: 須指到某個attr(寫成?attrName這種) 09/21 15:16
ssccg: 然後只要在theme裡面指定這些attr實際上是對應到哪個color 09/21 15:17
ssccg: 換掉Theme就會整組換掉了 09/21 15:17
ssccg: 這些都只要xml設定不用改程式 09/21 15:21
我大概會用了! 用關鍵字 attr Google 後寫了一小段測試的 似乎是可行的? 流程如下: 先在 values 資料夾下創一個 attrs.xml <resources> <declare-styleable name="main"> <attr name="main_color" format="color" /> </declare-styleable> </resources> 然後在 style.xml 內設定: <style name="main" parent="Theme.AppCompat.NoActionBar"> <item name="main_color">@color/main_color</item> </style> <style name="main2" parent="Theme.AppCompat.NoActionBar"> <item name="main_color">@color/main_color2</item> </style> 接著在 activity_main.xml 內設定: <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?attr/main_color"/> 最後在程式內設定: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (style == 0) { setTheme(R.style.main); } else { setTheme(R.style.main2); } setContentView(R.layout.activity_main); } 是不是這樣就可以了呢?  
ssccg: 這樣沒錯,不過換Theme必須重啟Activity就是,可接受就ok 09/21 18:30
大感謝!  
ssccg: 另外android 5.0之前有個bug,drawable中不能用attr 09/21 18:36
ssccg: 如果要支援5.0之前的版本,drawable還是必須用多個xml 09/21 18:36
我也發現到了… 原本有寫幾個 selector.xml 內部改成 attr 就會 crash 那這樣 drawable 該怎麼修改呢? 我照著這篇去做: https://stackoverflow.com/a/13471695 結果還是 crash… android.view.InflateException: Binary XML file line #42: Error inflating class android.widget.ListView Caused by: android.content.res.Resources$NotFoundException: File res/drawable/selector.xml from drawable resource ID #0x7f020057 以下是我的寫法: attrs.xml <resources> <declare-styleable name="format"> <attr name="main_color" format="color" /> <attr name="sub_color" format="color" /> <attr name="list_view_selector" format="reference" /> </declare-styleable> </resources> selector.xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="?attr/main_color" android:state_pressed="true" /> <item android:drawable="?attr/sub_color" /> </selector> style.xml <style name="main" parent="Theme.AppCompat.NoActionBar"> <item name="main_color">@color/main_color</item> <item name="sub_color">@color/sub_color</item> <item name="list_view_selector">@drawable/selector</item> </style> activity_main.xml <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="?attr/list_view_selector" />
benntqoo: 痾,沒有要你看那個網頁做 09/21 18:49
benntqoo: 抱歉讓你誤會 09/21 18:49
benntqoo: 只是他那個lib產生的效果應該是我認為你想要的結果 09/21 18:50
那個看起來也是差不多的效果 但是實作對我來說有點困難…  
ssccg: drawable要在5.0前用就只能寫多個,把你的selector.xml複製 09/21 21:55
ssccg: 一份像你原本的,各個Theme的list_view_selector再用對應的 09/21 21:57
ssccg: (原本的是說裡面直接寫@color的) 09/21 21:59
ssccg: 或是你連結那篇下面有個用ColorStateList的方法,但那必須 09/21 22:15
ssccg: 用程式去設ColorStateList給view,不能直接寫在layout中 09/21 22:16
看來只能這樣了 複製多個 selector.xml 在 style.xml 內去各個對應 不過已經比一開始好很多了 - 處理完切換色系的問題了 還有一個額外的疑問是 該怎麼切換自己的「字體」? 我有在 assets 資料夾底下放幾個 .ttf 字體檔案 但是查了一下發現要設定自己的字體 幾乎都要在程式面處理 像是: Typeface type = Typeface.createFromAsset(getAssets(),"kaiu.ttf"); myTextView.setTypeface(type); 有沒有辦法像前面改色系那樣 從 attr 去設定呢 再用 theme 去做一次套用呢? 這樣直接改 .xml 比較快…   - 最後是寫個自定義的 class 繼承 TextView 在內部寫個改字體的 switch 然後再把 xml 內的 <TextView 改成自定義的 TextView 之後就能直接套用了   ※ 編輯: gcobc12632 (61.222.191.73), 09/25/2017 16:43:34