本文介紹在Android開發中關於資源文件的存儲操作。對於Android資源也是非常重要的,主要包括文本字符串(strings)、顏色(colors)、數組(arrays)、動畫(anim)、布局(layout)、圖像和圖標(drawable)、音頻視頻(media)和其他應用程序使用的組件。
在Android開發中,資源文件是我們使用頻率最高的,無論是string,drawable,還是layout,這些資源都是我們經常使用到的,而且為我們的開發提供了很多方便,不過我們平時接觸的資源目錄一般都是下面這三個:

當然了,Android資源文件還有其他類型,如下圖所示:
這些資源都需要通過相應的資源類來進行管理。 下面請看管理這些資源的相關類:
int getColor(int id) //對應res/values/colors.xml
Drawable getDrawable(int id) //對應res/drawable/
XmlResourceParser getLayout(int id) //對應res/layout/
String getString(int id) 和CharSequence getText(int id) //對應res/values/strings.xml
InputStream openRawResource(int id) //對應res/raw/
void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) //對應res/xml/
String[] getStringArray(int id) //對應res/values/arrays.xml
float getDimension(int id) //對應res/values/dimens.xml
下面讓我們分別來介紹這些資源文件及使用方法。
1. 字符串:
字符串存儲在/res/values/strings.xml文件中,它的格式比較簡單,這里不再詳述。正如上面所說,讀取字符串需要通過如下代碼:
String str = getResources().getString(R.string.hello); CharSequence cha = getResources().getText(R.string.app_name);
2.字符串數組:
字符串數組存儲在/res/values/arrays.xml文件中,它的格式如下代碼所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="flavors">
<item>Vanilla</item>
<item>Chocolate</item>
<item>Strawberry</item>
</string-array>
</resources>
獲取字符數組內容需要通過如下方式:
String strs[] = getResources().getStringArray(R.array.flavors);
3.顏色值:
顏色存儲在/res/values/colors.xml文件中,格式如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="text_color">#F00</color>
</resources>
顏色值是一個整數,只需要通過R.color.獲取即可。
4.尺寸值:
尺寸存儲在/res/values/dimens.xml文件中,格式如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="txt_app_title">22sp</dimen>
<dimen name="font_size_10">10sp</dimen>
<dimen name="font_size_12">12sp</dimen>
<dimen name="font_size_14">14sp</dimen>
<dimen name="font_size_16">16sp</dimen>
</resources>
獲取尺寸使用下列代碼:
float myDimen = getResources().getDimension(R.dimen.dimen標簽name屬性的名字);
另外,需要注意的是:尺寸不同的單位代表的值不一樣,具體看下圖:

官方推薦我們使用dp和sp進行表示,當然因情況而已,也可使用其他的尺寸。下同是一個簡單的尺寸轉換類,只是實現簡單的轉換,如果需求更多的朋友可以加入更多的轉換功能,如下代碼:
package com.enterprise.cqbc.utility;
/**
* Android尺寸單位轉換工具類
* @Description: Android尺寸單位轉換工具類
* @File: DisplayUtility.java
* @Package com.enterprise.cqbc.utility
* @Author Hanyonglu
* @Date 2012-03-24 下午05:03:07
* @Version V1.0
*/
public class DisplayUtility {
/**
* 將px值轉換為dip或dp值,保證尺寸大小不變
* @param pxValue
* @param scale(DisplayMetrics類中屬性density)
* @return
*/
public static int pxTodip(float pxValue, float scale) {
return (int) (pxValue / scale + 0.5f);
}
/**
* 將dip或dp值轉換為px值,保證尺寸大小不變
* @param dipValue
* @param scale(DisplayMetrics類中屬性density)
* @return
*/
public static int dipTopx(float dipValue, float scale) {
return (int) (dipValue * scale + 0.5f);
}
/**
* 將px值轉換為sp值,保證文字大小不變
* @param pxValue
* @param fontScale(DisplayMetrics類中屬性scaledDensity)
* @return
*/
public static int pxTosp(float pxValue, float fontScale) {
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 將sp值轉換為px值,保證文字大小不變
* @param spValue
* @param fontScale(DisplayMetrics類中屬性scaledDensity)
* @return
*/
public static int spTopx(float spValue, float fontScale) {
return (int) (spValue * fontScale + 0.5f);
}
}
5.簡單的Drawable圖形:
Drawable圖形存儲在/res/drawable/drawables.xml中,其格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<drawable name="red_rect">#F00</drawable>
</resources>
要在代碼中使用應按如下格式:
ColorDrawable myDraw = (ColorDrawable)getResources().getDrawable(R.drawable.red_rect);
6.圖像:
圖像也是經常用到的一類資源,其格式有如下幾種:

(1) 使用9格拉伸圖像
由於手機屏幕擁有各種不同的分辨率,如果能夠根據不同的屏幕尺寸和方向或者不同長度的調整圖像大小,那么采用9格拉伸圖像將是非常方便的,而且它是一種被拉伸而不失真的圖像格式。
使用步驟如下:
A、運行 Android SDK Tools --adraw9patch.bat文件。
B、將一個png文件拖入左側的面板中。
C、選中左側底部的Show patches【斑點】。
D、將Patch scale設置為合適的值(比能夠看見標記結果值稍大)。
E、沿着圖像的右邊沿單擊,以設置水平“格”引導。
F、沿着圖像的上邊沿單擊,以設置垂直“格”引導。
G、在右側面板中查看結果,移動“格”導引知道圖像按照預期的結果進行拉伸。
H、要刪除一個“格”導引,按住“Shift”鍵在導引的像素(黑色)上點擊即可。
I、命名為.9.png保存圖像。
(2) 下面是打開adraw9patch.bat工具的例圖:

關於9格拉伸圖像的詳細信息這里不再詳述,有興趣的朋友查閱相關文檔。
(3) 在我們的程序中使用圖像的方式因不同情況而采取不同的方法。如果將flag.png圖像存放在/res/drawable目錄中,我們在使用時只需要通過R.drawable.flag即可;也可以直接訪問BitmapDrawable對象,如下代碼:
BitmapDrawable bitmapFlag = (BitmapDrawable)getResources().getDrawable(R.drawable.icon); int iBitmapHeightInPixels = bitmapFlag.getIntrinsicHeight(); int iBitmapWidthInPixels = bitmapFlag.getIntrinsicWidth();
如果是使用9格拉伸圖像,則就不能使用上面的代碼,需要將BitmapDrawable 改為NinePatchDrawable對象,即:
NinePatchDrawable bitmapFlag = (NinePatchDrawable)getResources().getDrawable(R.drawable.icon);
7.動畫:
在Android中,動畫由四種類型組成,如下圖所示:

動畫是存儲在/res/anim/目錄中,它可以使用XML文件來定義,也可以將其寫的JAVA代碼中,其XML代碼格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="300"
android:toDegrees="-360"
android:pivotX="10%"
android:pivotY="100%"
android:duration="10000" />
</set>
Animation主要有兩種動畫模式:一種是tweened animation(漸變動畫),另一種是frame by frame(畫面轉換動畫) ,用XML和JAVA表示分別如下所示:

下面依次說明下在xml文件中含義。
<alpha>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
/>
<!-- 透明度控制動畫效果 alpha
浮點型值:
fromAlpha 屬性為動畫起始時透明度
toAlpha 屬性為動畫結束時透明度
說明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字
長整型值:
duration 屬性為動畫持續時間
說明:
時間以毫秒為單位
-->
</set>
<scale>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
</set>
<!-- 尺寸伸縮動畫效果 scale
屬性:interpolator 指定一個動畫的插入器
在我試驗過程中,使用android.res.anim中的資源時候發現
有三種動畫插入器:
accelerate_decelerate_interpolator 加速-減速 動畫插入器
accelerate_interpolator 加速-動畫插入器
decelerate_interpolator 減速- 動畫插入器
其他的屬於特定的動畫效果
浮點型值:
fromXScale 屬性為動畫起始時 X坐標上的伸縮尺寸
toXScale 屬性為動畫結束時 X坐標上的伸縮尺寸
fromYScale 屬性為動畫起始時Y坐標上的伸縮尺寸
toYScale 屬性為動畫結束時Y坐標上的伸縮尺寸
說明:
以上四種屬性值
0.0表示收縮到沒有
1.0表示正常無伸縮
值小於1.0表示收縮
值大於1.0表示放大
pivotX 屬性為動畫相對於物件的X坐標的開始位置
pivotY 屬性為動畫相對於物件的Y坐標的開始位置
說明:
以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
長整型值:
duration 屬性為動畫持續時間
說明: 時間以毫秒為單位
布爾型值:
fillAfter 屬性 當設置為true ,該動畫轉化在動畫結束后被應用
-->
<translate>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="30"
android:toXDelta="-80"
android:fromYDelta="30"
android:toYDelta="300"
android:duration="2000"
/>
<!-- translate 位置轉移動畫效果
整型值:
fromXDelta 屬性為動畫起始時 X坐標上的位置
toXDelta 屬性為動畫結束時 X坐標上的位置
fromYDelta 屬性為動畫起始時 Y坐標上的位置
toYDelta 屬性為動畫結束時 Y坐標上的位置
注意:
沒有指定fromXType toXType fromYType toYType 時候,
默認是以自己為相對參照物
長整型值:
duration 屬性為動畫持續時間
說明: 時間以毫秒為單位
-->
</set>
<rotate>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="+350"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000" />
<!-- rotate 旋轉動畫效果
屬性:interpolator 指定一個動畫的插入器
在我試驗過程中,使用android.res.anim中的資源時候發現
有三種動畫插入器:
accelerate_decelerate_interpolator 加速-減速 動畫插入器
accelerate_interpolator 加速-動畫插入器
decelerate_interpolator 減速- 動畫插入器
其他的屬於特定的動畫效果
浮點數型值:
fromDegrees 屬性為動畫起始時物件的角度
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大於360度
說明:
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
pivotX 屬性為動畫相對於物件的X坐標的開始位置
pivotY 屬性為動畫相對於物件的Y坐標的開始位置
說明: 以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
長整型值:
duration 屬性為動畫持續時間
說明: 時間以毫秒為單位
-->
</set>
若要在程序中使用動畫效果,需按以下方式引用,如下代碼所示:
/**
* 加載動畫效果
* @param context 程序的上下文
* @param id 動畫XML文件的引用
* @return
*/
public static Animation loadAnimation(Context context, int id){
Animation myAnimation= AnimationUtils.loadAnimation(this,R.anim.push_left);
}
關於動畫效果剛才講過,除了可以在XML文件中設置以外,還可以在JAVA代碼中編寫,如下例所示:
//在代碼中定義動畫實例對象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
//根據各自的構造方法來初始化一個實例對象
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
下面我再來給大家分別介紹下在JAVA中代碼的含義,方便我們在以后使用。關於各個對象的定義我就沒必要在這里介紹了,只介紹它們的構造函數參數定義和設置動畫持續的時間。
AlphaAnimation類對象構造如下:
AlphaAnimation(float fromAlpha, float toAlpha) //第一個參數fromAlpha為 動畫開始時候透明度 //第二個參數toAlpha為 動畫結束時候透明度 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); //說明: // 0.0表示完全透明 // 1.0表示完全不透明
設置動畫持續時間:
myAnimation_Alpha.setDuration(5000); //設置時間持續時間為 5000毫秒
ScaleAnimation類對象構造如下:
ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一個參數fromX為動畫起始時 X坐標上的伸縮尺寸
//第二個參數toX為動畫結束時 X坐標上的伸縮尺寸
//第三個參數fromY為動畫起始時Y坐標上的伸縮尺寸
//第四個參數toY為動畫結束時Y坐標上的伸縮尺寸
/*說明:
以上四種屬性值
0.0表示收縮到沒有
1.0表示正常無伸縮
值小於1.0表示收縮
值大於1.0表示放大
*/
//第五個參數pivotXType為動畫在X軸相對於物件位置類型
//第六個參數pivotXValue為動畫相對於物件的X坐標的開始位置
//第七個參數pivotXType為動畫在Y軸相對於物件位置類型
//第八個參數pivotYValue為動畫相對於物件的Y坐標的開始位置
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
設置動畫持續時間:
myAnimation_Scale.setDuration(700); //設置時間持續時間為 700毫秒
TranslateAnimation類對象構造如下:
TranslateAnimation(float fromXDelta, float toXDelta,
float fromYDelta, float toYDelta)
//第一個參數fromXDelta為動畫起始時 X坐標上的移動位置
//第二個參數toXDelta為動畫結束時 X坐標上的移動位置
//第三個參數fromYDelta為動畫起始時Y坐標上的移動位置
//第四個參數toYDelta為動畫結束時Y坐標上的移動位置
設置動畫持續時間:
myAnimation_Translate.setDuration(2000); //設置時間持續時間為 2000毫秒
RotateAnimation類對象構造如下:
RotateAnimation(float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一個參數fromDegrees為動畫起始時的旋轉角度
//第二個參數toDegrees為動畫旋轉到的角度
//第三個參數pivotXType為動畫在X軸相對於物件位置類型
//第四個參數pivotXValue為動畫相對於物件的X坐標的開始位置
//第五個參數pivotXType為動畫在Y軸相對於物件位置類型
//第六個參數pivotYValue為動畫相對於物件的Y坐標的開始位置
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
設置動畫持續時間:
myAnimation_Rotate.setDuration(3000); //設置時間持續時間為 3000毫秒
8. 菜單文件:
Android中的菜單和動畫一樣,即可在XML中定義,也可寫在我們的程序中,下面主要是介紹在XML中定義,關於在程序中的使用大家可以查閱相關文檔,不再詳述。
菜單存儲在/res/menu目錄下,以下是其代碼格式:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_main_offline" android:icon="@android:drawable/ic_menu_always_landscape_portrait" android:title="@string/menu_main_offline" />
<item android:id="@+id/menu_main_fav" android:icon="@drawable/ic_menu_star" android:title="@string/menu_main_fav" />
<item android:id="@+id/menu_main_config" android:icon="@android:drawable/ic_menu_preferences" android:title="@string/menu_main_config" />
<item android:id="@+id/menu_main_about" android:icon="@android:drawable/ic_menu_info_details" android:title="@string/menu_main_about" />
</menu>
<!--
<menu>根元素沒有屬性,它包含<item>和<group>子元素。
<group>表示一個菜單組,相同的菜單組可以一起設置其屬性,例如visible、enabled和checkable等。
<group>元素的屬性說明如下。
id:唯一標示該菜單組的引用id。
menuCategory:對菜單進行分類,定義菜單的優先級,有效值為container、system、secondary和alternative。
orderInCategory:一個分類排序整數。
checkableBehavior:選擇行為,單選、多選還是其他。有效值為none、all和single。
visible:是否可見,true或者false。
enabled:是否可用,true或者false。
<item>表示菜單項,包含在<menu>或<group>中的有效屬性。
<item>元素的屬性說明如下。
id:唯一標示菜單的ID引用。
menuCategory:菜單分類。
orderInCategory:分類排序。
title:菜單標題字符串。
titleCondensed:濃縮標題,適合標題太長的時候使用。
icon:菜單的圖標。
alphabeticShortcut:字符快捷鍵。
numericShortcut:數字快捷鍵。
checkable:是否可選。
checked:是否已經被選。
visible:是否可見。
enabled:是否可用。
-->
在代碼中使用該菜單文件如下方式所示:
package com.code.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
/**
* Android使用菜單文件示例
* @Description: Android使用菜單文件示例
* @File: Activity2.java
* @Package com.code.test
* @Author Hanyonglu
* @Date 2012-03-24 下午05:49:33
* @Version V1.0
*/
public class MenuActivity extends Activity{
private MenuInflater menuInfalter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 實例化MenuInflater對象
menuInfalter = new MenuInflater(this);
}
/**
* 創建菜單
*/
public boolean onCreateOptionsMenu(Menu menu) {
// 調用MenuInflater的inflate方法,通過配置文件創建菜單 。
menuInfalter.inflate(R.menu.help_menu, menu);
return true;
}
}
9. XML文件:
XML文件存儲在/res/xml目錄中,這個目錄中大家可能偶爾用到過,這里可以用來存儲xml格式的文件,並且和其他資源文件一樣,這里的資源是會被編譯成二進制格式放到最終的安裝包里的,我們也可以通過R類來訪問這里的文件,並且解析里面的內容。
例如我們在這里存放了一個名為books.xml的文件:
<?xml version="1.0" encoding="utf-8"?>
<book>
<title>Android應用開發</title>
<title>IPhone游戲開發</title>
</book>
隨后,我們就可以通過資源ID來訪問並解析這個文件了,有關XML的解析在這里不再詳述,請訪問我的另一篇文章:http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html 。
需要大家要注意的是,這里的xml文件,最終是會被編譯成二進制形式的,如果大家想讓文件原樣存儲的話,那么就要用到下一個講解的資源了,那就是/res/raw目錄,它可以存儲原始文件。
10. 原始文件:
如剛才所講,可以將原始文件存儲在/res/raw目錄中,這個目錄的唯一區別就是,這里的文件會原封不動的存儲到設備上,不會被編譯為二進制形式,訪問的方式也是通過R類,下面是代碼示例:
public void setRawResource(){
((TextView)findViewById(R.id.txRaw)).setText(readStream(getResources().openRawResource(R.raw.rawtext)));
}
private String readStream(InputStream is) {
try {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int i = is.read();
while(i != -1) {
bo.write(i);
i = is.read();
}
return bo.toString();
} catch (IOException e) {
return "";
}
}
這次使用資源類中的方法,openRawResource,返回給我們一個輸入流,這樣我們就可以任意讀取文件中的內容了,例如上面例子中那樣,原樣輸出文本文件中的內容。當然我們也可以直接讀取raw目錄下文件數據,如下代碼所示:
/**
* 讀取raw文件夾下文件數據
* @param fileName
* @return
*/
public String getFromRaw(String fileName){
String res = "";
try{
InputStream in = getResources().openRawResource(R.raw.test1);
int length = in.available();
byte [] buffer = new byte[length];
in.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
in.close();
}catch(Exception e){
e.printStackTrace();
}
return res ;
}
當然,如果我們需要更高的自由度,盡量不受android平台的約束,那么/assets這個目錄就是我們的首選了。
這個目錄中的文件除了不會被編譯成二進制形式之外,另外一點就是,訪問方式是通過文件名,而不是資源ID。並且還有更重要的一點就是,大家可以在這里任意的建立子目錄,而/res目錄中的資源文件是不能自行建立子目錄的。如果需要這種靈活的資源存儲方式,那么就看看下面這個例子:
AssetManager assets = getAssets();
((TextView)findViewById(R.id.txAssets)).setText(readStream(assets.open("data.txt")));
在context上下文中,調用getAssets返回一個AssetManager,然后使用open方法就可以訪問需要的資源了,這里open方法是以assets目錄為根的。所以上面這段代碼訪問的是assets目錄中名為data.txt的資源文件。readStream方法在上面提到過,不再詳說。如果要直接獲取asset目錄下文件並讀取數據,也可按這樣編寫:
/**
* 獲取asset目錄下文件並讀取數據
* @param fileName
* @return
*/
public String getFromAsset(String fileName){
String res="";
try{
InputStream in = getResources().getAssets().open(fileName);
int length = in.available();
byte [] buffer = new byte[length];
in.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
}catch(Exception e){
e.printStackTrace();
}
return res;
}
如果需要獲取assets文件夾下的所有文件,可通過如下方法:
/**
* 獲取asset目錄所有文件
*/
public void getAllAssetFiles(){
try {
String[] files = getAssets().list("");
for(String f : files){
System.out.println(f);
}
} catch (Exception e) {
// TODO: handle exception
}
}
關於Android獲取assets的文件路徑有如下方法:
第一種方法:
String path = "file:///android_asset/文件名";
第二種方法:
InputStream abpath = getClass().getResourceAsStream("/assets/文件名");
若要想要轉換成String類型,則使用下列代碼:
String path = new String(InputStreamToByte(is));
private byte[] InputStreamToByte(InputStream is) throws IOException {
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
int ch;
while ((ch = is.read()) != -1) {
bytestream.write(ch);
}
byte imgdata[] = bytestream.toByteArray();
bytestream.close();
return imgdata;
}
11. 布局文件:
布局文件就不再詳細講了,因為我們對這個實在是太熟悉了。
12.樣式和主題:
Android中的Style 和 Theme(樣式和主題)和Web開發中的CSS樣式差不多,它主要是存儲在res/values/目錄下,文件名為styles.xml。下面是官方對Style說明:
Style:是一個包含一種或者多種格式化屬性的集合,我們可以將其用為一個單位用在布局XML單個元素當中。比如,我們可以定義一種風格來定義文本的字號大小和顏色,然后將其用在View元素的一個特定的實例。
例如下面是自定義一個Style的示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- TextView標題樣式 -->
<style name="textview_style_title">
<item name="android:textSize">18dp</item>
<item name="android:textColor">#888888</item>
</style>
</resources>
然后我們就可以將其應用在TextView中,如下:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello"
style="@style/textview_style_title" />
在上面的示例中,我們設置了TextView的字體大小和字體顏色。除了自定義style以外,我們還可以直接使用Android平台中給我們提供的style或是在自己定義的style中繼承Android中的style,下面是在我們自已的style中繼承Android中的style,如下代碼:
<style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>
下面是關於Theme的說明。
Theme:是一個包含一種或者多種格式化屬性的集合,我們可以將其為一個單位用在應用中所有的Activity當中或者應用中的某個Activity當 中。比如,我們可以定義一個Theme,它為window frame和panel 的前景和背景定義了一組顏色,並為菜單定義可文字的大小和顏色屬性,可以將這個Theme應用在你程序當中所有的Activity里。以下是定義一個Theme的示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme" parent="android:Theme.Light">
<item name="android:windowBackground">@color/custom_theme_color</item>
<item name="android:colorBackground">@color/custom_theme_color</item>
</style>
</resources>
在程序中使用Theme時,可在配置文件中通過以下方式:
<activity android:theme="@style/CustomTheme">
Theme在程序的使用如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.NewTheme);
setContentView(R.layout.main);
}
注意,Theme是應用在Activity上的資源。
以上就是關於Android中的資源文件的存儲和使用,在使用過程中注意不同的資源的使用方式。如果需要查看更多更詳細的資源文件存儲,請查閱Android官方文檔,這里不再詳述。
轉載地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/27/2419533.html

