一、样式
AndroidStyle分为两种:
1、Theme是针对窗体级别的,改变窗体的样式。
2、Style是针对窗体元素级别的,改变指定控件或者Layout样式。
Android系统的主题和样式位于frameworks\base\core\res\res\values\,其中包含很多系统定义好的style。
1.1、自定义样式
1、在res/values目录新建style.xml文件,并增加<resources>根节点。
2、对每个主题或风格增加唯一名称,同时也可以继承某个风格。
3、在<style>元素内部,申明一个或多个<item>,并得以名称属性,并在元素内部定义该风格的值。
4、之后则可以通过@style应用在其他xml中。
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="SpecialText" parent="@style/Text"> <item name="android:textSize">18sp</item> <item name="android:textColor">#008</item> </style> </resources>
1.2、样式抽取
为了提高布局文件复用性,我们可以将相同控件的属性进行抽取,在res/string.xml中添加style节点,每个属性对应一个item子节点
1.3、样式继承
1、当一种样式具有另一种样式相同的属性,并且还有自特有的属性,我们就可以使用继承样式。
2、继承的第二种方式
1.4、修改系统样式
1、查找D:\Android\sdk\platforms\android-18\data\res\values目录下的styles.xml文件
2、文件中搜索需要用到的控件,进行观察,这里以ProgressBar系统样式为例。
<style name="Widget.ProgressBar"> <item name="android:indeterminateOnly">true</item> <item name="android:indeterminateDrawable">@android:drawable/progress_medium_white</item> <item name="android:indeterminateBehavior">repeat</item> <item name="android:indeterminateDuration">3500</item> <item name="android:minWidth">48dip</item> <item name="android:maxWidth">48dip</item> <item name="android:minHeight">48dip</item> <item name="android:maxHeight">48dip</item> <item name="android:mirrorForRtl">false</item> </style>
3.发现其实ProgressBar引用了一个图片资源,那么使用工具搜索到Progress_medium_white,发现其实是一个xml文件,也就是一个旋转动画。
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/spinner_white_48" android:pivotX="50%" android:pivotY="50%" android:framesCount="12" android:frameDuration="100" />
4.旋转动画中又引用了spinner_white_48,发现它其实是一张图片,所以我们可以修改ProgressBar的样式图片。
5.拷贝第3步的内容,也就是布局动画文件,然后在drawable目录下创建一个xml文件,将拷贝的内容复制进去,再修改drawable属性下对应的图片。
6.在布局文件的ProgressBar中使用indeterminateDrawable引用该xml资源文件。
二、主题
1.1、自定义主题
和风格一样,主题依然在<style>元素中申明,引用方式也是一样的,不同的是通过在清单文件定义的<application>和<activity>元素将主题添加到某个程序,
但是主题不能应用在view中。
<resources> <style name="CustomTheme"> <item name="android:windowNoTitle">true</item> <item name="windowFrame">@drawable/screen_frame</item> <item name="windowBackground">@drawable/screen_background_white</item> <item name="panelForegroundColor">#FF000000</item> <item name="panelBackgroundColor">#FFFFFFFF</item> <item name="panelTextColor">?panelForegroundColor</item> <item name="panelTextSize">14</item> <item name="menuItemTextColor">?panelTextColor</item> <item name="menuItemTextSize">?panelTextSize</item> </style> </resources>
- @符号:表示我们应用的资源是前面定义过的或在前一个项目中又或者在Android框架中。
- ?符号:表示我们引用的资源的值在当前的主题当中定义过的。
1.2、静态设置主题
1、如果在所有的activity中使用主题,则将主题设置在<application>标签中。
<application android:theme="@style/CustomTheme">
2、如果只让某个activity拥有主题,则将主题设置在<activity>标签中。
<activity android:theme="@android:style/Theme.Dialog">
3、如果针对某个主题进行轻微改变,只需要在style中将改主题设置为父主题即可。
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
1.3、动态设置主题
当我们想在代码setTheme()对主题进行动态设置的话,则必须在初始化任何view之前进行设置,比如在setContentView(View)或inflate(int,ViewGroup)方法之前。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... setTheme(android.R.style.Theme_Light); setContentView(R.layout.linear_layout_3); }
如果在代码中动态加载主界面主题,那么注意主题当中不能包括任何系统启动这个activity锁使用的动画,这些动画将在程序前显示。
1.4、利用主题设置Activity默认动画
a) 首先在res文件夹下建立anim文件夹,然后在里面建立fase_in.xml和fade_out.xml两个动画资源
fade_in.xml
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="0.0" android:interpolator="@android:anim/accelerate_interpolator" android:toAlpha="1.0" />
fade_out.xml
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="1.0" android:interpolator="@android:anim/accelerate_interpolator" android:toAlpha="0.0" />
b) 然后在values文件夹下的style.xml中的resources标签内写:
<style name="Anim_fade" parent="android:Theme.NoTitleBar"> <item name="android:windowAnimationStyle">@style/fade</item> </style> <style name="fade" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/fade_in</item> <item name="android:activityOpenExitAnimation">@anim/fade_out</item> <item name="android:activityCloseEnterAnimation">@anim/fade_in</item> <item name="android:activityCloseExitAnimation">@anim/fade_out</item> </style>
c) 最后一步在AndroidManifest.xml中的Activity的声明上加入android:theme="@style/Anim_fade"
但是在高版本的Android下可能会没有效果。
三、资源目录
1.1.字符串国际化
字符串的国际化只需要在res文件夹下新建对应语言的values文件夹即可。
1.2.图片国际化
在Android工程的res目录下,通过定义特殊的文件夹名称就可以实现多语言支持。比如我们的程序兼容简体中文、英文,在values文件夹中建立默认strings.xml,再建立values-zh-rCN文件夹。
在每个文件夹里放置一个strings.xml,strings.xml里是各种语言字符串。如果涉及到参数配置类xml文件夹名称也要改成xml-zh、xml。
这样在android的系统中进行语言切换,所开发的程序也会跟着切换语言。
1、常见的有
zh_cn: 简体中文
zh_hk: 繁体中文(中国香港)
zh_tw: 繁体中文(中国台湾地区)
en-hk: 英语(香港)
en_us: 英语(美国)
en_gb: 英语(英国)
en_ww: 英语(全球)
ja_jp: 日语(日本)
ko_kr: 韩文(韩国)
2、简单示例
3、引用字符串
a) xml文件中获取
android:text="@string/resource_name"
b) 活动中获取
方法一: this.getString(R.string.resource_name); 方法二: getResources().getString(R.string.resource_name);
c) 在其他java文件
方法一: context.getString(R.string.resource_name);
方法二: application.getString(R.string.resource_name);
1.4.String.xml
a)定义string类型
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello" >Hello World, MainActivity! </string> <string name="app_name" >TestExample01 </string> </resources> 使用方式: String appName = (String) this.getResources().getText(R.string.app_name); 或 String appName = (String) this.getResources().getString(R.string.app_name);
b)定义string数组(arrays.xml)
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球</item> <item>篮球</item> <item>太极</item> <item>冰球</item> </string-array> </resources> 使用方式: getResources().getStringArray(R.array.sports);
c)定义颜色(colors.xml)
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="black">#FFFFFF</color> </resources> 使用方式: getResources().getDrawable(R.string.black); 或 getResources().getColor(R.string.black);
d)定义尺寸(dimens.xml)
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="height">80dip</dimen> </resources> 使用方式: getResource().getDimension(R.string.height);
e)定义样式(style.xml)
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="sharpText"> <item name="android:textSize">18sp</item> <item name="android:textColor">#000000</item> </style> </resources>
1.5、占位符
在Android中,如果需要动态的修改value/string.xml中的值,则可以使用占位符
string.xml中节点是支持占位符的,如下所示:
<string name="data">整数型:%1$d,浮点型:%2$.2f,字符串:%3$s</string>
获取字符串并进行格式化,需要注意的是浮点型数据中的.2表示保留多少位小数。
String data = getResources().getString(R.string.data);
data = String.format(data, 100,10.3,"2016-02-14");
运行结果如下所示:
假设我们需要让部分的文字变色,则可以通过html代码来实现
tvRemaid.setText(Html.fromHtml("每月提现次数为5次,剩余<font color='#ff0000'>" + count + "</font>次"));