Android 資源(resource詳解(轉)


 本文介紹在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 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM