[問題] 切換色系及字體?(已解決
我在 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
09/20 13:12, 1F
→
09/20 13:13, , 2F
09/20 13:13, 2F
→
09/20 13:14, , 3F
09/20 13:14, 3F
→
09/20 13:14, , 4F
09/20 13:14, 4F
→
09/20 13:20, , 5F
09/20 13:20, 5F
→
09/20 13:21, , 6F
09/20 13:21, 6F
推
09/20 14:14, , 7F
09/20 14:14, 7F
→
09/20 14:14, , 8F
09/20 14:14, 8F
→
09/20 14:16, , 9F
09/20 14:16, 9F
→
09/20 14:18, , 10F
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
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
09/21 15:14, 18F
→
09/21 15:16, , 19F
09/21 15:16, 19F
→
09/21 15:17, , 20F
09/21 15:17, 20F
→
09/21 15:17, , 21F
09/21 15:17, 21F
→
09/21 15:21, , 22F
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
09/21 18:30, 23F
大感謝!
→
09/21 18:36, , 24F
09/21 18:36, 24F
→
09/21 18:36, , 25F
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
09/21 18:50, 28F
那個看起來也是差不多的效果
但是實作對我來說有點困難…
→
09/21 21:55, , 29F
09/21 21:55, 29F
→
09/21 21:57, , 30F
09/21 21:57, 30F
→
09/21 21:59, , 31F
09/21 21:59, 31F
→
09/21 22:15, , 32F
09/21 22:15, 32F
→
09/21 22:16, , 33F
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
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章