值文件是Android应用必需的资源文件,其承担着应用的UI配置和文字显示工作。值文件包括字符串文件、字符串数组文件、配置文件、整数数组文件、维度文件、属性文件、颜色文件、风格文件、主题文件、标识符文件等,其中英文目录为res\values,简体中文目录为res\values-zh-rCN,繁体中文目录为res\values-zh-rTW,其命名规范遵循ISO639-2和ISO3166MA标准,其命名格式为:
values-<语言>-<方言>
1. 字符串
1.字符串资源的定义方法
res/values/strings.xml
字符串是最常用的值资源,其常用的设置方法如下:
<resources>
<string name="edit_event_from_label">From</string>
<string name="edit_event_all_day_label">All day</string>
</resources>
如果该字符串资源不必本地化,则需要设置其translatable属性为 false,具体如下:
<!-不需翻译-->
<string name="voice_mode_off" translatable="false">2</string>
除了name属性外,另一个需要注意的属性是msgid。msgid属性通常用于框架层,在应用层不需显式声明。
在Android中,特定的符号,如Nont中的“′”,无法直接在字符串资源中设置,开发者必须通过转义字符的方式进行显示。
在加载资源的过程中,会以资源的ID为线索进行加载。Android不允许在同一名字空间中出现相同的ID。
2.对字符串资源的引用
在Android中,资源分系统资源和应用资源两种,这两种资源在应用中引用的方式略有差异。系统资源并不全部对应用层开放,对应用层开放的系统资源在frameworks\base\core\res\res\values\目录下的public.xml中定义。不对应用层开放的系统资源的加载方式如下:
getString(com.android.internal.R.string. using);
//采用”@ com.android.internal.R./…”方式
除字符串资源以外的其他系统资源的加载方式和加载字符串资源类似,后面就不再详述其他类型的系统资源的加载了。
1.引用应用本身的字符串资源
1. 在XML配置文件中
<EditText android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="18sp"
//引用字符串,采用“@string/...”方式
android:text="@string/hello_activity_text_text" />
2. 在Java文件中
//采用“R.string.***”方式
test.setText(R.string.hello_activity_text_text);
2.引用框架层的字符串资源
1.在XML配置文件中
<EditText android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
//中等字体
android:textAppearance="?android:attr/textAppearanceMedium"
//引用字符串,采用"@android:string/..."方式
android:text="@android:string/cancel" />
2.在Java文件中
//采用“android .R.string.***”方式
test.setText(android.R.string.cancel);
3.数据交换
对于复杂的字符串数据,出于方便设计的考虑,Android支持XLIFF (XML Localization Interchange File Format)和通配符。
在一个字符串标签中Android仅支持一个通配符,其应用方法如下:
<string name="test">test "%1"</string>
在Java中加载通配符的方法如下:
test.setText(getString(R.string.hello).replace("%1",
String.valueOf(curPage)));
Android对XLIFF的支持的实现也非常简单。以ANR为例,其字符串资源如下:
<string name="anr_process">Process <xliff:g
id="process">%1$s</xliff:g> is not responding.</string>
XLIFF的名字空间为xmlns:xliff=”urn:oasis:names:tc:xliff:document:1.2”。
在Java中加载字符串的方法如下:
//采用的加载方法为getString (resId, formatArgs)
res.getString(com.android.internal.R.string.anr_process,
name1.toString(), name2.toString());
(3)下画线的实现
在Android中,文字特效目前仅支持加粗和斜体两种,如果希望实现加下画线的功能,则需要借助HTML语法,实现方法如下:
textView.setText(Html.fromHtml(““+helloStr+”“));
(4)语言切换的实现
语言的切换是通过资源管理器进行的,方法如下:
Resources resources = getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources .getDisplayMetrics();
config.locale = Locale.SIMPLIFIED_CHINESE;
resources.updateConfiguration(config, dm);
通过类似的设置,开发者也可以切换屏幕密度、MCC、MNC、屏幕方向等,当然部分设置可能需要高级别的权限。
2. 字符串数组
1.字符串数组的定义
字符串数组通常用于下拉框等场景。如果不希望该字符串数组随着语言环境的变化而变化,可以将字符串数组的translatable属性设为false,方法如下:
<string-array name="preferences_alert_type_values" translatable="false">
<item>"0"</item>
<item>"1"</item>
<item>"2"</item>
</string-array>
2.字符串数组的加载
1.在XML配置文件中
<ListPreference
android:key="preferences_alerts_type"
android:title="@string/preferences_alerts_type_title"
//字符串数组,采用"@array/..."方式
android:entries="@array/preferences_alert_type_labels"
android:entryValues="@array/preferences_alert_type_values"/>
2.在Java中
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.colors, android.R.layout.simple_spinner_item);
//采用“R.array.***”方式
3. 整数数组
1.整数数组的定义
整数数组和字符串数组的使用方法类似,下面是整数数组的实现:
<integer-array name="config_virtualKeyVibePattern">
<item>0</item>
<item>10</item>
<item>20</item>
<item>30</item>
</integer-array>
2.整数数组的加载
1.在XML配置文件中
2.在Java中
int[] tmpArray =
getResources().getIntArray(com.android.internal.R.array.config_virtualKeyVibePattern);
4. 配置文件
1.配置文件的定义
配置文件在应用开发中并不常用,通常用于应用的设置等场景,配置文件的实现如下:
<resources>
<bool name="config_sf_limitedAlpha">false</bool>
<integer name="config_shortAnimTime">150</integer>
</resources>
2.配置文件的加载
1.在XML配置文件中
2.在Java中
mLimitedAlphaCompositing = context.getResources().getBoolean(
com.android.internal.R.bool.config_sf_limitedAlpha); //采用“R. bool.***”方式
5. 维度文件
维度文件的实现也非常简单,示例如下:
84dp
63dp
在Java中维度文件的加载方式如下:
Int w =
getResources().getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
6. 属性文件
1.属性文件的定义
res/values/attrs.xml
在Android中,属性文件通常由多个标签(如declare-styleable、eat-comment、attr)组成。
declare-styleable标签用于声明一个属性组,一个属性组可以由多个属性构成。在如下代码中,declare-styleable声明标签名为Animation的属性组。
<declare-styleable name="Animation">
...
</declare-styleable>
eat-comment标签用于声明标签上的内容为注释。
attr标签用于声明属性。一个属性包括属性名和属性格式两部分。示例:
<resources>
<attr name="buttonStyle" format="reference" />
<attr name="buttonStyleSmall" format="reference" />
</resources>
目前,Android支持的常用属性格式包括:
属性格式 | 涵义 |
---|---|
reference | 对资源的引用 |
color | 颜色 |
float | |
integer | |
fraction | |
boolean | 布尔 |
dimension | |
string |
需要注意的是,Android允许属性支持多种属性格式。下面是background属性的实现示例:
<attr name="background" format="reference|color" />
由上述示例可以看出,background属性既可加载配置文件,又可直接设置ARGB值。
为属性配置偏好值的方法如下:
<attr name="bufferType">
<enum name="normal" value="0" />
<enum name="spannable" value="1" />
<enum name="editable" value="2" />
</attr>
偏好值的实现分为enum、flag两种类型,其中flag表示以二进制方式表示偏好值。
2.属性文件的加载
2.在JAVA中
TypedArray a = context.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.Animation);
...
a.recycle(); //用于随后的复用
7. 颜色文件
颜色的设置文件通常会放在框架层的资源目录中。对颜色属性进行引用而不是在应用层显式声明,有利于在系统层面保持UI的一致性。在颜色的声明中,采用的是ARGB的格式。
1.颜色的定义
<resources>
<color name="magic_flame">#00ffffff</color>
<color name="button_text">#ffffffff</color>
</resources>
2.颜色的加载
1.在XML配置文件中
<TextView android:id="@+id/error"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/red"
android:textStyle="bold"
android:visibility="gone"/>
2.在JAVA中
//采用“ R.color.***”方式
setBackgroundColor(getResources().getColor(R.color.candidate_background));
另外,在Android中,Google提供了多种系统颜色定义,如primary_text_dark、primary_text_light、white、black、transparent等。
8. 风格文件
一个好的应用除了技术上应设计得优雅外(即代码具有高的可读性、可扩展性、复用性、性能),用户体验也非常重要(包括文字的用语和观感、图片的观感和交互设计)。风格的设计决定了用户体验中文字和图片的效果。风格文件的设置方法如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="digit_button_style" parent="button_style">
<item name="android:background">@drawable/blue_button</item>
</style>
</resources>
2.风格文件的加载
1.在XML配置文件中
<com.android.calculator2.ColorButton
android:id="@+id/digit7"
android:text="@string/digit7"
style="@style/digit_button_style" />
9. 主题文件
主题文件在框架层比较常用。对于进行差异化工作的厂商而言,保持同一个主题是一个基本的UI需求,定义统一的风格文件供公司所有产品引用,是个不错的选择,示例如下:
<style name="Theme.Light.NoTitleBar">
<item name="android:windowNoTitle">true</item>
</style>
2.主题文件的加载
1.XML配置文件中
<activity android:name=".fuelgauge.PowerUsageDetail"
android:theme="@android:style/Theme.NoTitleBar"
android:label="@string/details_title">
</activity>
风格和主题的设计看似简单,实际上涉及的维度很多,既要考虑到用户的视觉感受,又要照顾不同层次、不同地区用户的文化差异。如何在考虑这些要素的基础上将需要的信息以一种统一、简洁、优雅的方式呈现出来,挑战很大,通常需要UI、UE工程师具备多年的积累和深厚的文化底蕴。
10. 标识符文件
标识符文件对于应用层开发者来说并不常见,但这并不意味着开发者完全接触不到,在使用系统提供的ListView、Tab等就会涉及。标识符文件的实现方式如下。
<resources>
<item type="id" name="background" />
<item type="id" name="checkbox" />
<item type="id" name="content" />
</resources>
在实际的开发中,经常需要自定义Tab的布局,这时候必须声明tabhost、tabcontent、tabs等控件ID为系统ID,方法如下:
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
</TabHost>
对于自定义列表的布局,必须声明ListView的控件ID为系统ID,方法如下:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
...
</FrameLayout>