作者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/cn.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