Android官方培训课程学习第一部分,主要包括:
1. 使用字符资源
2. 创建区域设置目录及字符串文件
3. 适配不同的屏幕
4. 运行时检查系统版本
使用字符资源
我们可以在源代码和其他XML文件中通过元素的name属性来引用自己的字符串资源。
在源代码中可以通过R.string.语法来引用一个字符串资源,很多方法都可以通过这种方式来接收字符串。
例如:
//Get a string resource from your app's Resources
String hello = getResources().getString(R.string.hello_world);
// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);
在其他XML文件中,每当XML属性要接受一个字符串值时,你都可以通过@string/语法来引用字符串资源。
例如:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
创建区域设置目录及字符串文件
为支持多国语言,在res/中创建一个额外的values目录,以连字符和ISO国家代码结尾命名,比如:values-es/ 是为语言代码为”es”的区域设置的简单的资源文件的目录。Android会在运行时根据设备的区域设置,加载相应的资源。
若决定支持某种语言,则需要创建资源子目录和字符串资源文件,例如:
MyProject/
res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
添加不同区域语言的字符串值到相应的文件。
Android系统运行时会根据用户设备当前的区域设置,使用相应的字符串资源。
例如:
英语(默认区域语言),/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">My Application</string>
<string name="hello_world">Hello World!</string>
</resources>
西班牙语,/values-es/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">Mi Aplicación</string>
<string name="hello_world">Hola Mundo!</string>
</resources>
适配不同的屏幕
- 有4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
- 4种普遍分辨率:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi)
为了针对不同的屏幕去优化用户体验,我们需要为每一种将要支持的屏幕尺寸创建唯一的XML文件。每一种layout需要保存在相应的资源目录中,目录以-为后缀命名。
例如,对大尺寸屏幕(large screens),一个唯一的layout文件应该保存在res/layout-large/中。
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
layout文件的名字必须完全一样,为了对相应的屏幕尺寸提供最优的UI,文件的内容不同。
系统会根据app所运行的设备屏幕尺寸,在与之对应的layout目录中加载layout。
另一个例子,这一个工程中有为适配横向屏幕的layout:
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
默认的,layout/main.xml
文件用作竖屏的layout。
如果想给横屏提供一个特殊的layout,也适配于大屏幕,那么则需要使用large和land修饰符。
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
我们应该为4种普遍分辨率:低,中,高,超高精度,都提供相适配的bitmap资源。
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (基准)
- ldpi: 0.75
如果针对xhdpi的设备生成了一张200x200的图像,那么应该为hdpi生成150x150,为mdpi生成100x100, 和为ldpi生成75x75的图片资源。
运行时检查系统版本
Android在Build常量类中提供了对每一个版本的唯一代号,在我们的app中使用这些代号可以建立条件,保证依赖于高级别的API的代码,只会在这些API在当前系统中可用时,才会执行。
private void setUpActionBar() {
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
Note:当解析XML资源时,Android会忽略当前设备不支持的XML属性。所以我们可以安全地使用较新版本的XML属性,而不需要担心旧版本Android遇到这些代码时会崩溃。例如如果我们设置
targetSdkVersion="11"
,app会在Android 3.0或更高时默认包含ActionBar。然后添加menu items到action bar时,我们需要在自己的menu XML资源中设置android:showAsAction="ifRoom"
。在跨版本的XML文件中这么做是安全的,因为旧版本的Android会简单地忽略showAsAction
属性(就是这样,你并不需要用到res/menu-v11/
中单独版本的文件)。