推 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: 但是特定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