Android的資源文件介紹

【庫】res/raw與assets區(qū)別:http://blog.csdn.net/chdjj/article/details/19154687

在Android開發(fā)中,資源文件是我們使用頻率最高的嗽交,無論是string压状,drawable,還是layout,這些資源都是我們經(jīng)常使用到的捞蚂,而且為我們的開發(fā)提供了很多方便,不過我們平時接觸的資源目錄一般都是下面這三個:


常用資源類型

當(dāng)然了跷究,Android資源文件還有其他類型,如下圖所示:


全部資源類型
這些資源都需要通過相應(yīng)的資源類來進(jìn)行管理敲霍。

下面請看管理這些資源的相關(guān)類:

    int getColor(int id)  //對應(yīng)res/values/colors.xml 

    Drawable getDrawable(int id) //對應(yīng)res/drawable/

    XmlResourceParser getLayout(int id) //對應(yīng)res/layout/

    String getString(int id) 和CharSequence getText(int id) //對應(yīng)res/values/strings.xml

    InputStream openRawResource(int id) //對應(yīng)res/raw/

    void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) //對應(yīng)res/xml/

    String[] getStringArray(int id) //對應(yīng)res/values/arrays.xml

    float getDimension(int id) //對應(yīng)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.字符串?dāng)?shù)組:

字符串?dāng)?shù)組存儲在/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>
獲取字符數(shù)組內(nèi)容需要通過如下方式:
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>

顏色值是一個整數(shù),只需要通過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標(biāo)簽name屬性的名字);

另外,需要注意的是:尺寸不同的單位代表的值不一樣兵拢,具體看下圖:


官方推薦我們使用dp和sp進(jìn)行表示翻斟,當(dāng)然因情況而已,也可使用其他的尺寸说铃。下同是一個簡單的尺寸轉(zhuǎn)換類访惜,只是實(shí)現(xiàn)簡單的轉(zhuǎn)換嘹履,如果需求更多的朋友可以加入更多的轉(zhuǎn)換功能,如下代碼:

package com.enterprise.cqbc.utility;
/**  
    Android尺寸單位轉(zhuǎn)換工具類 * 
    @Description: Android尺寸單位轉(zhuǎn)換工具類 *
    @File: DisplayUtility.java * 
    @Package com.enterprise.cqbc.utility * 
    @Author Hanyonglu * 
    @Date 2012-03-24 下午05:03:07 *
    @Version V1.0 
*/
public class DisplayUtility {

    /** * 將px值轉(zhuǎn)換為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值轉(zhuǎn)換為px值砾嫉,保證尺寸大小不變  
    @param dipValue * 
    @param scale(DisplayMetrics類中屬性density) 
    @return 
    */ 
    public static int dipTopx(float dipValue, float scale) { 
        return (int) (dipValue * scale + 0.5f); 
    } 

    /** 
        將px值轉(zhuǎn)換為sp值,保證文字大小不變 
        @param pxValue * 
        @param fontScale(DisplayMetrics類中屬性scaledDensity)  
        @return 
    */ 
    public static int pxTosp(float pxValue, float fontScale) { 
        return (int) (pxValue / fontScale + 0.5f); 
    } 

    /** 
        將sp值轉(zhuǎn)換為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>

要在代碼中使用應(yīng)按如下格式:

ColorDrawable myDraw = (ColorDrawable)getResources().getDrawable(R.drawable.red_rect);
6.圖像:

圖像也是經(jīng)常用到的一類資源,其格式有如下幾種:


  • 使用9格拉伸圖像  
    由于手機(jī)屏幕擁有各種不同的分辨率舌剂,如果能夠根據(jù)不同的屏幕尺寸和方向或者不同長度的調(diào)整圖像大小济锄,那么采用9格拉伸圖像將是非常方便的,而且它是一種被拉伸而不失真的圖像格式霍转。

    使用步驟如下:  
    A荐绝、運(yùn)行 Android SDK Tools --adraw9patch.bat文件”芟  
    B低滩、將一個png文件拖入左側(cè)的面板中⊙遗纾  
    C恕沫、選中左側(cè)底部的Show patches【斑點(diǎn)】∩匆猓  
    D婶溯、將Patch scale設(shè)置為合適的值(比能夠看見標(biāo)記結(jié)果值稍大)⊥得梗  
    E迄委、沿著圖像的右邊沿單擊,以設(shè)置水平“格”引導(dǎo)类少⌒鹕恚  
    F、沿著圖像的上邊沿單擊硫狞,以設(shè)置垂直“格”引導(dǎo)信轿。  
    G残吩、在右側(cè)面板中查看結(jié)果财忽,移動“格”導(dǎo)引知道圖像按照預(yù)期的結(jié)果進(jìn)行拉伸∈榔剩  
    H定罢、要刪除一個“格”導(dǎo)引,按住“Shift”鍵在導(dǎo)引的像素(黑色)上點(diǎn)擊即可旁瘫∽尜欤  
    I琼蚯、命名為.9.png保存圖像。

  • 下面是打開adraw9patch.bat工具的例圖:



    關(guān)于9格拉伸圖像的詳細(xì)信息這里不再詳述惠况,有興趣的朋友查閱相關(guān)文檔遭庶。

  • 在我們的程序中使用圖像的方式因不同情況而采取不同的方法。
    如果將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(畫面轉(zhuǎn)換動畫) ,用XML和JAVA表示分別如下所示:


下面依次說明下在xml文件中含義唆垃。

alpha

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alphaandroid:fromAlpha="0.1"android:toAlpha="1.0"android:duration="3000"/> 
<!-- 
透明度控制動畫效果 alpha 
浮點(diǎn)型值: 
    fromAlpha 屬性為動畫起始時透明度 
    toAlpha 屬性為動畫結(jié)束時透明度 
    說明: 
        0.0表示完全透明 
        1.0表示完全不透明 
        以上值取0.0-1.0之間的float數(shù)據(jù)類型的數(shù)字 
長整型值: 
    duration 屬性為動畫持續(xù)時間 
說明: 
    時間以毫秒為單位-->
</set>

scale

~~~xml
<?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中的資源時候發(fā)現(xiàn) 有三種動畫插入器: 
        accelerate_decelerate_interpolator 加速-減速 動畫插入器 
        accelerate_interpolator 加速-動畫插入器 
        decelerate_interpolator 減速- 動畫插入器 其他的屬于特定的動畫效果 
    浮點(diǎn)型值: 
        fromXScale 屬性為動畫起始時 X坐標(biāo)上的伸縮尺寸 
        toXScale 屬性為動畫結(jié)束時 X坐標(biāo)上的伸縮尺寸 
        fromYScale 屬性為動畫起始時Y坐標(biāo)上的伸縮尺寸 
        toYScale 屬性為動畫結(jié)束時Y坐標(biāo)上的伸縮尺寸 
    說明: 以上四種屬性值 
        0.0表示收縮到?jīng)]有 
        1.0表示正常無伸縮 值小于
        1.0表示收縮 
        值大于1.0表示放大 

    pivotX 
        屬性為動畫相對于物件的X坐標(biāo)的開始位置 
    pivotY 
        屬性為動畫相對于物件的Y坐標(biāo)的開始位置 
    說明: 以上兩個屬性值 從0%-100%中取值 50%為物件的X或Y方向坐標(biāo)上的中點(diǎn)位置 

    長整型值: 
        duration 屬性為動畫持續(xù)時間 說明: 時間以毫秒為單位 
    布爾型值: 
        fillAfter 屬性 當(dāng)設(shè)置為true ,該動畫轉(zhuǎn)化在動畫結(jié)束后被應(yīng)用
-->

translate

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translateandroid:fromXDelta="30"
        android:toXDelta="-80"
        android:fromYDelta="30"
        android:toYDelta="300"
        android:duration="2000"/>
<!-- translate 位置轉(zhuǎn)移動畫效果 
    整型值: 
        fromXDelta 屬性為動畫起始時 X坐標(biāo)上的位置 
        toXDelta 屬性為動畫結(jié)束時 X坐標(biāo)上的位置 
        fromYDelta 屬性為動畫起始時 Y坐標(biāo)上的位置 
        toYDelta 屬性為動畫結(jié)束時 Y坐標(biāo)上的位置 
    注意: 沒有指定fromXType toXType fromYType toYType 時候辕万, 默認(rèn)是以自己為相對參照物 
    長整型值: 
        duration 屬性為動畫持續(xù)時間 說明: 時間以毫秒為單位-->
</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 旋轉(zhuǎn)動畫效果 
        屬性:
        interpolator 
            指定一個動畫的插入器 在我試驗過程中枢步,使用android.res.anim中的資源時候發(fā)現(xiàn)有三種動畫插入器: 
            accelerate_decelerate_interpolator 加速-減速 動畫插入器 
            accelerate_interpolator 加速-動畫插入器 
            decelerate_interpolator 減速- 動畫插入器 其他的屬于特定的動畫效果 
        浮點(diǎn)數(shù)型值: 
            fromDegrees 屬性為動畫起始時物件的角度 
            toDegrees 屬性為動畫結(jié)束時物件旋轉(zhuǎn)的角度 可以大于360度 
        說明: 
        當(dāng)角度為負(fù)數(shù)——表示逆時針旋轉(zhuǎn) 當(dāng)角度為正數(shù)——表示順時針旋轉(zhuǎn) (負(fù)數(shù)from——to正數(shù):順時針旋轉(zhuǎn)) (負(fù)數(shù)from——to負(fù)數(shù):逆時針旋轉(zhuǎn)) (正數(shù)from——to正數(shù):順時針旋轉(zhuǎn)) (正數(shù)from——to負(fù)數(shù):逆時針旋轉(zhuǎn)) 
            pivotX 屬性為動畫相對于物件的X坐標(biāo)的開始位置 
            pivotY 屬性為動畫相對于物件的Y坐標(biāo)的開始位置 
        說明:
            以上兩個屬性值 從0%-100%中取值 50%為物件的X或Y方向坐標(biāo)上的中點(diǎn)位置 
        長整型值: 
            duration 屬性為動畫持續(xù)時間 
            說明: 時間以毫秒為單位-->
</set>

若要在程序中使用動畫效果,需按以下方式引用蓄坏,如下代碼所示:

/** * 
    加載動畫效果 * 
    @param context 程序的上下文 * 
    @param id 動畫XML文件的引用 * 
    @return 
*/ 
public static Animation loadAnimation(Context context, int id){ 
    Animation myAnimation = AnimationUtils.loadAnimation(this,R.anim.push_left); 
}

關(guān)于動畫效果剛才講過价捧,除了可以在XML文件中設(shè)置以外,還可以在JAVA代碼中編寫涡戳,如下例所示:

//在代碼中定義動畫實(shí)例對象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
//根據(jù)各自的構(gòu)造方法來初始化一個實(shí)例對象
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中代碼的含義,方便我們在以后使用脯倚。關(guān)于各個對象的定義我就沒必要在這里介紹了渔彰,只介紹它們的構(gòu)造函數(shù)參數(shù)定義和設(shè)置動畫持續(xù)的時間。

AlphaAnimation類對象構(gòu)造如下:

AlphaAnimation(float fromAlpha, float toAlpha) 
//第一個參數(shù)fromAlpha為 動畫開始時候透明度
//第二個參數(shù)toAlpha為 動畫結(jié)束時候透明度
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
//說明: 
// 0.0表示完全透明
// 1.0表示完全不透明

設(shè)置動畫持續(xù)時間:

myAnimation_Alpha.setDuration(5000);
//設(shè)置時間持續(xù)時間為 5000毫秒

ScaleAnimation類對象構(gòu)造如下:

ScaleAnimation(float fromX, 
    float toX, float fromY, 
    float toY, int pivotXType, 
    float pivotXValue, 
    int pivotYType, 
    float pivotYValue
) 

//第一個參數(shù)fromX為動畫起始時 X坐標(biāo)上的伸縮尺寸 
//第二個參數(shù)toX為動畫結(jié)束時 X坐標(biāo)上的伸縮尺寸 
//第三個參數(shù)fromY為動畫起始時Y坐標(biāo)上的伸縮尺寸 
//第四個參數(shù)toY為動畫結(jié)束時Y坐標(biāo)上的伸縮尺寸 

/*說明: 以上四種屬性值 
    0.0表示收縮到?jīng)]有 
    1.0表示正常無伸縮 
    值小于1.0表示收縮 
    值大于1.0表示放大
*/
//第五個參數(shù)pivotXType為動畫在X軸相對于物件位置類型 
//第六個參數(shù)pivotXValue為動畫相對于物件的X坐標(biāo)的開始位置
//第七個參數(shù)pivotXType為動畫在Y軸相對于物件位置類型 
//第八個參數(shù)pivotYValue為動畫相對于物件的Y坐標(biāo)的開始位置

myAnimation_Scale =new ScaleAnimation(
    0.0f, 
    1.4f, 
    0.0f, 
    1.4f, 
    Animation.RELATIVE_TO_SELF, 
    0.5f, 
    Animation.RELATIVE_TO_SELF, 
    0.5f
);

設(shè)置動畫持續(xù)時間:

myAnimation_Scale.setDuration(700);
//設(shè)置時間持續(xù)時間為 700毫秒

TranslateAnimation類對象構(gòu)造如下:

TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 
//第一個參數(shù)fromXDelta為動畫起始時 X坐標(biāo)上的移動位置 
//第二個參數(shù)toXDelta為動畫結(jié)束時 X坐標(biāo)上的移動位置 
//第三個參數(shù)fromYDelta為動畫起始時Y坐標(biāo)上的移動位置 
//第四個參數(shù)toYDelta為動畫結(jié)束時Y坐標(biāo)上的移動位置 

設(shè)置動畫持續(xù)時間:

myAnimation_Translate.setDuration(2000);
//設(shè)置時間持續(xù)時間為 2000毫秒

RotateAnimation類對象構(gòu)造如下:

RotateAnimation(
    float fromDegrees, 
    float toDegrees, 
    int pivotXType, 
    float pivotXValue, 
    int pivotYType, 
    float pivotYValue
)
//第一個參數(shù)fromDegrees為動畫起始時的旋轉(zhuǎn)角度 
//第二個參數(shù)toDegrees為動畫旋轉(zhuǎn)到的角度 
//第三個參數(shù)pivotXType為動畫在X軸相對于物件位置類型 
//第四個參數(shù)pivotXValue為動畫相對于物件的X坐標(biāo)的開始位置
//第五個參數(shù)pivotXType為動畫在Y軸相對于物件位置類型 
//第六個參數(shù)pivotYValue為動畫相對于物件的Y坐標(biāo)的開始位置
myAnimation_Rotate=new RotateAnimation(
0.0f, 
+350.0f, 
Animation.RELATIVE_TO_SELF,
0.5f,
Animation.RELATIVE_TO_SELF, 
0.5f
);

設(shè)置動畫持續(xù)時間:

myAnimation_Rotate.setDuration(3000);
//設(shè)置時間持續(xù)時間為 3000毫秒
8. 菜單文件:

Android中的菜單和動畫一樣推正,即可在XML中定義恍涂,也可寫在我們的程序中,下面主要是介紹在XML中定義植榕,關(guān)于在程序中的使用大家可以查閱相關(guān)文檔再沧,不再詳述。
  菜單存儲在/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>表示一個菜單組,相同的菜單組可以一起設(shè)置其屬性顷扩,
    例如visible拐邪、enabled和checkable等。 
<group>元素的屬性說明如下隘截。 
    id:唯一標(biāo)示該菜單組的引用id扎阶。 
    menuCategory:對菜單進(jìn)行分類,定義菜單的優(yōu)先級婶芭,
        有效值為container东臀、system、secondary和alternative犀农。
    orderInCategory:一個分類排序整數(shù)惰赋。 
    checkableBehavior:選擇行為,單選井赌、多選還是其他谤逼。有效值為none、all和single仇穗。 
    visible:是否可見流部,true或者false。 
    enabled:是否可用纹坐,true或者false枝冀。 
<item>表示菜單項,包含在<menu>或<group>中的有效屬性耘子。 
<item>元素的屬性說明如下果漾。 
    id:唯一標(biāo)示菜單的ID引用。 
    menuCategory:菜單分類谷誓。 
    orderInCategory:分類排序绒障。 
    title:菜單標(biāo)題字符串。 
    titleCondensed:濃縮標(biāo)題捍歪,適合標(biāo)題太長的時候使用户辱。 
    icon:菜單的圖標(biāo)。 
    alphabeticShortcut:字符快捷鍵糙臼。 
    numericShortcut:數(shù)字快捷鍵庐镐。 
    checkable:是否可選。 
    checked:是否已經(jīng)被選变逃。 
    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); 
            // 實(shí)例化MenuInflater對象  
            menuInfalter = new MenuInflater(this); 
            } 
            / * 創(chuàng)建菜單 */ 
            public boolean onCreateOptionsMenu(Menu menu) { 
            // 調(diào)用MenuInflater的inflate方法,通過配置文件創(chuàng)建菜單 名眉。 
            menuInfalter.inflate(R.menu.help_menu, menu); 
            return true; 
        } 
    }
9. XML文件:

XML文件存儲在/res/xml目錄中粟矿,這個目錄中大家可能偶爾用到過,這里可以用來存儲xml格式的文件璧针,并且和其他資源文件一樣嚷炉,這里的資源是會被編譯成二進(jìn)制格式放到最終的安裝包里的,我們也可以通過R類來訪問這里的文件探橱,并且解析里面的內(nèi)容申屹。
  例如我們在這里存放了一個名為books.xml的文件:

<?xml version="1.0" encoding="utf-8"?> 
<book> 
    <title>Android應(yīng)用開發(fā)</title> 
    <title>IPhone游戲開發(fā)</title>
</book> 

隨后,我們就可以通過資源ID來訪問并解析這個文件了隧膏,有關(guān)XML的解析在這里不再詳述哗讥,請訪問我的另一篇文章:
http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html
需要大家要注意的是胞枕,這里的xml文件杆煞,最終是會被編譯成二進(jìn)制形式的,如果大家想讓文件原樣存儲的話腐泻,那么就要用到下一個講解的資源了决乎,那就是/res/raw目錄,它可以存儲原始文件派桩。

10. 原始文件:

如剛才所講构诚,可以將原始文件存儲在/res/raw目錄中,這個目錄的唯一區(qū)別就是铆惑,這里的文件會原封不動的存儲到設(shè)備上范嘱,不會被編譯為二進(jìn)制形式,訪問的方式也是通過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返回給我們一個輸入流,這樣我們就可以任意讀取文件中的內(nèi)容了撕阎,例如上面例子中那樣受裹,原樣輸出文本文件中的內(nèi)容。當(dāng)然我們也可以直接讀取raw目錄下文件數(shù)據(jù)虏束,如下代碼所示:

  / * 讀取raw文件夾下文件數(shù)據(jù) * 
@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 ; 
} 

當(dāng)然名斟,如果我們需要更高的自由度,盡量不受android平臺的約束魄眉,那么/assets這個目錄就是我們的首選了。
  
  這個目錄中的文件除了不會被編譯成二進(jìn)制形式之外闷袒,另外一點(diǎn)就是坑律,訪問方式是通過文件名,而不是資源ID。**并且還有更重要的一點(diǎn)就是晃择,大家可以在這里任意的建立子目錄冀值,而/res目錄中的資源文件是不能自行建立子目錄的。
**如果需要這種靈活的資源存儲方式宫屠,那么就看看下面這個例子:

AssetManager assets = getAssets(); 
((TextView)findViewById(R.id.txAssets)).setText(readStream(assets.open("data.txt")));

在context上下文中列疗,調(diào)用getAssets返回一個AssetManager,然后使用open方法就可以訪問需要的資源了浪蹂,這里open方法是以assets目錄為根的抵栈。所以上面這段代碼訪問的是assets目錄中名為data.txt的資源文件。readStream方法在上面提到過坤次,不再詳說古劲。如果要直接獲取asset目錄下文件并讀取數(shù)據(jù),也可按這樣編寫:

/** * 
    獲取asset目錄下文件并讀取數(shù)據(jù) * 
    @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 
    } 
}

關(guān)于Android獲取assets的文件路徑有如下方法:
  第一種方法:

  String path = "file:///android_asset/文件名";

第二種方法:

  InputStream abpath = getClass().getResourceAsStream("/assets/文件名");

若要想要轉(zhuǎn)換成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. 布局文件:

布局文件就不再詳細(xì)講了,因為我們對這個實(shí)在是太熟悉了滑绒。

12.樣式和主題:

Android中的Style 和 Theme(樣式和主題)和Web開發(fā)中的CSS樣式差不多闷堡,它主要是存儲在res/values/目錄下,文件名為styles.xml疑故。下面是官方對Style說明:

Style:是一個包含一種或者多種格式化屬性的集合杠览,我們可以將其用為一個單位用在布局XML單個元素當(dāng)中。比如焰扳,我們可以定義一種風(fēng)格來定義文本的字號大小和顏色倦零,然后將其用在View元素的一個特定的實(shí)例。

例如下面是自定義一個Style的示例:

<?xml version="1.0" encoding="utf-8"?>
<resources>  
<!-- TextView標(biāo)題樣式 --> 
    <style name="textview_style_title"> 
        <item name="android:textSize">18dp</item> 
        <item name="android:textColor">#888888</item> 
    </style>
</resources>

然后我們就可以將其應(yīng)用在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" />

在上面的示例中扫茅,我們設(shè)置了TextView的字體大小和字體顏色。除了自定義style以外育瓜,我們還可以直接使用Android平臺中給我們提供的style或是在自己定義的style中繼承Android中的style葫隙,下面是在我們自已的style中繼承Android中的style,如下代碼:

<style name="GreenText" parent="@android:style/TextAppearance"> 
    <item name="android:textColor">#00FF00</item> 
</style>

下面是關(guān)于Theme的說明躏仇。

Theme:是一個包含一種或者多種格式化屬性的集合恋脚,我們可以將其為一個單位用在應(yīng)用中所有的Activity當(dāng)中或者應(yīng)用中的某個Activity當(dāng) 中。
比如焰手,我們可以定義一個Theme糟描,它為window frame和panel的前景和背景定義了一組顏色,并為菜單定義可文字的大小和顏色屬性书妻,可以將這個Theme應(yīng)用在你程序當(dāng)中所有的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是應(yīng)用在Activity上的資源见间×拇常  
  以上就是關(guān)于Android中的資源文件的存儲和使用,在使用過程中注意不同的資源的使用方式米诉。如果需要查看更多更詳細(xì)的資源文件存儲菱蔬,請查閱Android官方文檔,這里不再詳述史侣。

轉(zhuǎn)載地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/27/2419533.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拴泌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抵窒,更是在濱河造成了極大的恐慌弛针,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件李皇,死亡現(xiàn)場離奇詭異削茁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掉房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門茧跋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卓囚,你說我怎么就攤上這事瘾杭。” “怎么了哪亿?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵粥烁,是天一觀的道長。 經(jīng)常有香客問我蝇棉,道長讨阻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任篡殷,我火速辦了婚禮钝吮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘板辽。我一直安慰自己奇瘦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布劲弦。 她就那樣靜靜地躺著耳标,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邑跪。 梳的紋絲不亂的頭發(fā)上麻捻,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天纲仍,我揣著相機(jī)與錄音,去河邊找鬼贸毕。 笑死,一個胖子當(dāng)著我的面吹牛夜赵,可吹牛的內(nèi)容都是我干的明棍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼寇僧,長吁一口氣:“原來是場噩夢啊……” “哼摊腋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嘁傀,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兴蒸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后细办,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橙凳,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年笑撞,在試婚紗的時候發(fā)現(xiàn)自己被綠了岛啸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡茴肥,死狀恐怖坚踩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓤狐,我是刑警寧澤瞬铸,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站础锐,受9級特大地震影響嗓节,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郁稍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一赦政、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耀怜,春花似錦恢着、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至左痢,卻和暖如春靡羡,著一層夾襖步出監(jiān)牢的瞬間系洛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工略步, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留描扯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓趟薄,卻偏偏與公主長得像绽诚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杭煎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,745評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理恩够,服務(wù)發(fā)現(xiàn),斷路器羡铲,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 早晨等車也切,偶遇一股腦兒撲面而來的秋扑媚。 秋, 一葉知秋贾费, 一葉落而知天下秋…… 北方的秋讓人沉醉钦购。
    幸福的悖論閱讀 383評論 0 0
  • 學(xué)習(xí)催眠多年以來,廣泛吸收了多家的催眠技術(shù)褂萧,尤其在經(jīng)絡(luò)催眠課堂中更是深入研修押桃。周成松老師在繼承經(jīng)絡(luò)催眠的過...
    元柳青閱讀 854評論 0 2