[問題] 切換色系及字體?(已解決

看板AndroidDev作者 (Ted)時間7年前 (2017/09/20 12:50), 7年前編輯推噓4(4029)
留言33則, 4人參與, 最新討論串1/1
我在 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="" rel="nofollow">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

09/20 13:12, , 1F
textview設ID ex textviewTarget
09/20 13:12, 1F

09/20 13:13, , 2F
((TextView)findViewById(R.id.textviewTarget)).setTextC
09/20 13:13, 2F

09/20 13:14, , 3F
(接上) .setTextColor()
09/20 13:14, 3F

09/20 13:14, , 4F
這樣就可以了 很簡易
09/20 13:14, 4F

09/20 13:20, , 5F
我是要改整個APP內的顏色(切換色系)
09/20 13:20, 5F

09/20 13:21, , 6F
應該說是切換樣式那樣…
09/20 13:21, 6F

09/20 14:14, , 7F
寫theme設定不同主題的顏色檔
09/20 14:14, 7F

09/20 14:14, , 8F
可以大方向的更改整個app
09/20 14:14, 8F

09/20 14:16, , 9F
寫theme的話可以連xml內的設定都一起更改嗎?
09/20 14:16, 9F

09/20 14:18, , 10F
應該可以試著寫對應的style搭配theme更改整個顏色不要寫
09/20 14:18, 10F

09/20 14:18, , 11F
死顏色更換在程式碼中
09/20 14:18, 11F

09/20 14:18, , 12F
應該可以達到換顏色的效果
09/20 14:18, 12F

09/20 14:18, , 13F
不確定是不是最佳解,功有點多
09/20 14:18, 13F

09/20 14:23, , 14F
你要的功能應該是類似這樣
09/20 14:23, 14F

09/20 14:23, , 15F
09/20 14:23, 15F

09/20 14:23, , 16F
但是特定textView顏色可能要額外處理
09/20 14:23, 16F

09/20 17:33, , 17F
樓上那個網頁的方法…有看沒有懂 我程式功力還太弱了
09/20 17:33, 17F
後來用了另一種方法:直接多寫好幾個 layout(layout1.xml、layout2.xml…) 每個 layout 再套用自己的配色 然後在 setContentView 的地方做切換 雖然挺蠢的 不過以我的能力來講這大概是比較好的方法了…  

09/21 15:14, , 18F
Theme的寫法是xml(layout、drawable...)用到顏色的地方都必
09/21 15:14, 18F

09/21 15:16, , 19F
須指到某個attr(寫成?attrName這種)
09/21 15:16, 19F

09/21 15:17, , 20F
然後只要在theme裡面指定這些attr實際上是對應到哪個color
09/21 15:17, 20F

09/21 15:17, , 21F
換掉Theme就會整組換掉了
09/21 15:17, 21F

09/21 15:21, , 22F
這些都只要xml設定不用改程式
09/21 15:21, 22F
我大概會用了! 用關鍵字 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); } 是不是這樣就可以了呢?  

09/21 18:30, , 23F
這樣沒錯,不過換Theme必須重啟Activity就是,可接受就ok
09/21 18:30, 23F
大感謝!  

09/21 18:36, , 24F
另外android 5.0之前有個bug,drawable中不能用attr
09/21 18:36, 24F

09/21 18:36, , 25F
如果要支援5.0之前的版本,drawable還是必須用多個xml
09/21 18:36, 25F
我也發現到了… 原本有寫幾個 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="" rel="nofollow">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" />

09/21 18:49, , 26F
痾,沒有要你看那個網頁做
09/21 18:49, 26F

09/21 18:49, , 27F
抱歉讓你誤會
09/21 18:49, 27F

09/21 18:50, , 28F
只是他那個lib產生的效果應該是我認為你想要的結果
09/21 18:50, 28F
那個看起來也是差不多的效果 但是實作對我來說有點困難…  

09/21 21:55, , 29F
drawable要在5.0前用就只能寫多個,把你的selector.xml複製
09/21 21:55, 29F

09/21 21:57, , 30F
一份像你原本的,各個Theme的list_view_selector再用對應的
09/21 21:57, 30F

09/21 21:59, , 31F
(原本的是說裡面直接寫@color的)
09/21 21:59, 31F

09/21 22:15, , 32F
或是你連結那篇下面有個用ColorStateList的方法,但那必須
09/21 22:15, 32F

09/21 22:16, , 33F
用程式去設ColorStateList給view,不能直接寫在layout中
09/21 22:16, 33F
看來只能這樣了 複製多個 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
文章代碼(AID): #1PmVEj4P (AndroidDev)
文章代碼(AID): #1PmVEj4P (AndroidDev)