06、主题 & 样式 & 国际化

一、样式

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子节点

image

1.3、样式继承

1、当一种样式具有另一种样式相同的属性,并且还有自特有的属性,我们就可以使用继承样式。

image

2、继承的第二种方式

image

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" 

image

但是在高版本的Android下可能会没有效果。

三、资源目录

1.1.字符串国际化

字符串的国际化只需要在res文件夹下新建对应语言的values文件夹即可。

image

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");

运行结果如下所示:

cf523caa-e215-4282-8c41-35b5dc39c4e8

假设我们需要让部分的文字变色,则可以通过html代码来实现

tvRemaid.setText(Html.fromHtml("每月提现次数为5次,剩余<font color='#ff0000'>" + count + "</font>次"));

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

转载于:https://www.cnblogs.com/pengjingya/p/5505332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值