有許多東西用來(lái)構(gòu)建一個(gè)優(yōu)秀的 Android 應(yīng)用程序。除了應(yīng)用程序的編碼,你需要關(guān)注各種各樣的資源,諸如你用到的各種靜態(tài)內(nèi)容,如位圖,顏色,布局定義,用戶界面字符串,動(dòng)畫(huà)等等。這些資源一般放置在項(xiàng)目的 res/ 下獨(dú)立子目錄中。
這節(jié)教程將學(xué)習(xí)如何來(lái)組織應(yīng)用程序資源,指定替代資源,并在應(yīng)用程序中訪問(wèn)它們。
你需要將每種資源放置在項(xiàng)目中 res/ 目錄的特定子目錄下。例如,這是一個(gè)簡(jiǎn)單項(xiàng)目的文件層級(jí):
MyProject/
src/
MyActivity.java
res/
drawable/
icon.png
layout/
activity_main.xml
info.xml
values/
strings.xml
res/ 目錄在各種子目錄中包含了所有的資源。這里有一個(gè)圖片資源,兩個(gè)布局資源和一個(gè)字符串資源文件。下表詳細(xì)的給出了在項(xiàng)目中 res/ 目錄里面支持的資源。
目錄 | 資源類(lèi)型 |
---|---|
anim/ | 定義動(dòng)畫(huà)屬性的XML文件。它們被保存在res/anim/文件夾下,通過(guò)R.anim類(lèi)訪問(wèn) |
color/ | 定義顏色狀態(tài)列表的XML文件。它們被保存在res/color/文件夾下,通過(guò)R.color類(lèi)訪問(wèn) |
drawable/ | 圖片文件,如.png,.jpg,.gif或者XML文件,被編譯為位圖、狀態(tài)列表、形狀、動(dòng)畫(huà)圖片。它們被保存在res/drawable/文件夾下,通過(guò)R.drawable類(lèi)訪問(wèn) |
layout/ | 定義用戶界面布局的XML文件。它們被保存在res/layout/文件夾下,通過(guò)R.layout類(lèi)訪問(wèn) |
menu/ | 定義應(yīng)用程序菜單的XML文件,如選項(xiàng)菜單,上下文菜單,子菜單等。它們被保存在res/menu/文件夾下,通過(guò)R.menu類(lèi)訪問(wèn) |
raw/ | 任意的文件以它們的原始形式保存。需要根據(jù)名為R.raw.filename的資源ID,通過(guò)調(diào)用Resource.openRawResource()來(lái)打開(kāi)raw文件 |
values/ | 包含簡(jiǎn)單值(如字符串,整數(shù),顏色等)的XML文件。這里有一些文件夾下的資源命名規(guī)范。arrays.xml代表數(shù)組資源,通過(guò)R.array類(lèi)訪問(wèn);integers.xml代表整數(shù)資源,通過(guò)R.integer類(lèi)訪問(wèn);bools.xml代表布爾值資源,通過(guò)R.bool類(lèi)訪問(wèn);colors.xml代表顏色資源,通過(guò)R.color類(lèi)訪問(wèn);dimens.xml代表維度值,通過(guò)R.dimen類(lèi)訪問(wèn);strings.xml代表字符串資源,通過(guò)R.string類(lèi)訪問(wèn);styles.xml代表樣式資源,通過(guò)R.style類(lèi)訪問(wèn) |
xml/ | 可以通過(guò)調(diào)用Resources.getXML()來(lái)在運(yùn)行時(shí)讀取任意的XML文件??梢栽谶@里保存運(yùn)行時(shí)使用的各種配置文件 |
你的應(yīng)用程序需要為特定的設(shè)備配置提供替代的資源支持。比如說(shuō),你需要為不同的屏幕分辨率提供替代的圖片資源,為不同的語(yǔ)言提供替代的字符串資源。在運(yùn)行時(shí),Android 檢測(cè)當(dāng)前設(shè)備配置,并為應(yīng)用程序加載合適的資源。
要為特定的配置的確定一系列替代資源,遵循如下的步驟:
下面是一個(gè)例子,指定默認(rèn)屏幕的圖片和高分辨率的替代圖片。
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
values/
strings.xml
下面是另外一個(gè)例子,指定默認(rèn)語(yǔ)言的布局和阿拉伯語(yǔ)言的替代布局。
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
layout-ar/
main.xml
values/
strings.xml
在應(yīng)用程序開(kāi)發(fā)中,需要訪問(wèn)定義好的資源,不論是通過(guò)代碼還是通過(guò) XML 文件。下面的章節(jié)介紹如何分別在這兩種場(chǎng)景中訪問(wèn)資源。
當(dāng) Android 應(yīng)用程序被編譯,生成一個(gè) R 類(lèi),其中包含了所有 res/ 目錄下資源的 ID。你可以使用 R 類(lèi),通過(guò)子類(lèi)+資源名或者直接使用資源 ID 來(lái)訪問(wèn)資源。
訪問(wèn) res/drawable/myimage.png,并將其設(shè)置到 ImageView 上,你將使用以下代碼:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
這里第一行代碼用 R.id.myimageview 來(lái)在布局文件中獲取定義為 myimageview 的 ImageView。第二行用 R.drawable.myimage 來(lái)獲取在 res/ 的 drawable 子目錄下名為 myimage 的圖片。
考慮下一個(gè)例子,其中 res/values/strings.xml 有如下定義:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, World!</string>
</resources>
現(xiàn)在你可以在 ID 為 msg 的 TextView 對(duì)象上使用資源 ID 來(lái)設(shè)置文本,具體如下:
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
考慮如下定義的布局 res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
這個(gè)應(yīng)用程序代碼將為活動(dòng)加載這個(gè)布局,onCreate() 方法中如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
考慮下面的 XML 資源文件 res/values/strings.xml,其中包含一個(gè)顏色資源和一個(gè)字符串資源 -
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />
現(xiàn)在,你可以在下面的布局文件中使用這些資源來(lái)設(shè)置文本顏色和文本內(nèi)容:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />
現(xiàn)在,你如果再次回到上一章節(jié)講解的" Hello World! "實(shí)例,我可以確定,你對(duì)這節(jié)中所有的概念有了更好的理解。所以,我強(qiáng)烈建議回去看看之前的實(shí)例,并查看我使用不同資源的基本用法。
更多建議: