作者gcobc12632 (Ted)
看板AndroidDev
標題[問題] 切換色系及字體?
時間Wed Sep 20 12:50:47 2017
我在 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://webptt.com/m.aspx?n=bbs/AndroidDev/M.1505883053.A.119.html
1F:推 paulku: textview設ID ex textviewTarget 09/20 13:12
2F:→ paulku: ((TextView)findViewById(R.id.textviewTarget)).setTextC 09/20 13:13
3F:→ paulku: (接上) .setTextColor() 09/20 13:14
4F:→ paulku: 這樣就可以了 很簡易 09/20 13:14
5F:→ gcobc12632: 我是要改整個APP內的顏色(切換色系) 09/20 13:20
6F:→ gcobc12632: 應該說是切換樣式那樣… 09/20 13:21
7F:推 benntqoo: 寫theme設定不同主題的顏色檔 09/20 14:14
8F:→ benntqoo: 可以大方向的更改整個app 09/20 14:14
9F:→ gcobc12632: 寫theme的話可以連xml內的設定都一起更改嗎? 09/20 14:16
10F:→ benntqoo: 應該可以試著寫對應的style搭配theme更改整個顏色不要寫 09/20 14:18
11F:→ benntqoo: 死顏色更換在程式碼中 09/20 14:18
12F:→ benntqoo: 應該可以達到換顏色的效果 09/20 14:18
13F:→ benntqoo: 不確定是不是最佳解,功有點多 09/20 14:18
14F:推 benntqoo: 你要的功能應該是類似這樣 09/20 14:23
16F:→ benntqoo: 但是特定textView顏色可能要額外處理 09/20 14:23
17F:→ gcobc12632: 樓上那個網頁的方法…有看沒有懂 我程式功力還太弱了 09/20 17:33
後來用了另一種方法:直接多寫好幾個 layout(layout1.xml、layout2.xml…)
每個 layout 再套用自己的配色
然後在 setContentView 的地方做切換
雖然挺蠢的 不過以我的能力來講這大概是比較好的方法了…
18F:→ ssccg: Theme的寫法是xml(layout、drawable...)用到顏色的地方都必 09/21 15:14
19F:→ ssccg: 須指到某個attr(寫成?attrName這種) 09/21 15:16
20F:→ ssccg: 然後只要在theme裡面指定這些attr實際上是對應到哪個color 09/21 15:17
21F:→ ssccg: 換掉Theme就會整組換掉了 09/21 15:17
22F:→ 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);
}
是不是這樣就可以了呢?
23F:→ ssccg: 這樣沒錯,不過換Theme必須重啟Activity就是,可接受就ok 09/21 18:30
大感謝!
24F:→ ssccg: 另外android 5.0之前有個bug,drawable中不能用attr 09/21 18:36
25F:→ 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" />
26F:推 benntqoo: 痾,沒有要你看那個網頁做 09/21 18:49
27F:→ benntqoo: 抱歉讓你誤會 09/21 18:49
28F:→ benntqoo: 只是他那個lib產生的效果應該是我認為你想要的結果 09/21 18:50
那個看起來也是差不多的效果
但是實作對我來說有點困難…
29F:→ ssccg: drawable要在5.0前用就只能寫多個,把你的selector.xml複製 09/21 21:55
30F:→ ssccg: 一份像你原本的,各個Theme的list_view_selector再用對應的 09/21 21:57
31F:→ ssccg: (原本的是說裡面直接寫@color的) 09/21 21:59
32F:→ ssccg: 或是你連結那篇下面有個用ColorStateList的方法,但那必須 09/21 22:15
33F:→ 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