1. 相關文件夾介紹 在Android項目文件夾裡面,主要的資源文件是放在res文件夾裡面的。assets文件夾是存放不進行編譯加工的原生文件,即該文件夾裡面的文件不會像xml,java文件被預編譯,可以存放一些圖片,html,js, css等文件。在後面會介紹如何讀取assets文件夾的資源! r ...
1. 相關文件夾介紹 在Android項目文件夾裡面,主要的資源文件是放在res文件夾裡面的。assets文件夾是存放不進行編譯加工的原生文件,即該文件夾裡面的文件不會像xml,java文件被預編譯,可以存放一些圖片,html,js, css等文件。在後面會介紹如何讀取assets文件夾的資源! res文件夾裡面的多個文件夾的各自介紹(來自網上的Android開髮指南中文版內容):
目錄Directory |
資源類型Resource Types |
res/anim/ |
XML文件,它們被編譯進逐幀動畫(frame by frame animation)或補間動畫(tweened animation)對象 |
res/drawable/
res/drawable-hdpi/
res/drawable-ldpi/
res/drawable-mdpi/
res/drawable-xhdpi/
res/drawable-xxhdpi/
res/drawable-zh/
res/drawable-en-rUS-port-hdpi/ |
.png、.9.png、.jpg文件,它們被編譯進以下的Drawable資源子類型中: 要獲得這種類型的一個資源,可以使用Resource.getDrawable(id) 為了獲取資源類型,使用mContext.getResources().getDrawable(R.drawable.imageId) 註意:放在這裡的圖像資源可能會被aapt工具自動地進行無損壓縮優化。比如,一個真彩色但並不需要256色的PNG可能會被轉換為一個帶調色板的8位PNG。這使得同等質量的圖片占用更少的資源。所以我們得意識到這些放在該目錄下的二進位圖像在生成時可能會發生變化。如果你想讀取一個圖像位流並轉換成一個點陣圖(bitmap),請把圖像文件放在res/raw/目錄下,這樣可以避免被自動優化。
drawable- hdpi、drawable- mdpi、drawable-ldpi的區別: (1)drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480) (3)drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320) 系統會根據機器的解析度來分別到這幾個文件夾裡面去找對應的圖片。 在開發程式時為了相容不同平臺不同屏幕,建議各自文件夾根據需求均存放不同版本圖片。 Aphone一般到drawable-hdpi去取圖片,drawable-hdpi沒有圖片再到drawable-mdpi去取圖片,而後再到drawable-ldpi取圖片 Apad一般到drawable-mdpi去取圖片,drawable-hdpi沒有圖片再到drawable-ldpi去取圖片 橫屏含有drawable-land- hdpi、drawable-land- mdpi、drawable-land-ldpi的區別: Aphone一般到drawable-land-hdpi去取圖片,drawable-land-hdpi沒有圖片再到drawable-land-mdpi去取圖片,而後再到drawable-land-ldpi取圖片,而後才會到drawable-hdpi去取圖片,drawable-hdpi沒有圖片再到drawable-mdpi去取圖片,而後再到drawable-ldpi取圖片 Apad一般到drawable-land-mdpi去取圖片,drawable-land-hdpi沒有圖片再到drawable-land-ldpi去取圖片,而後才會到drawable-mdpi去取圖片,drawable-hdpi沒有圖片再到drawable-ldpi去取圖片
-finger 用於觸摸屏的設備 -hdpi 近似於240dpi的高級顯示密度的屏幕 -mdpi 近似於160dpi的中級顯示密度的屏幕 -ldpi 近似於120dpi的低級顯示密度的屏幕 -land 橫屏顯示 -port 豎屏顯示 -long 比較長的屏幕,例如WQVGA(432×240), WVGA(800×480), FWVGA(854×480)
drawable-en:英文設置下的圖片資料,drawable-zh中文設置下的圖片資料。
//豎屏 :drawable-en-rUS-port-hdpi 建樹這些文件夾是有次序的。即按優先順序別分列的,見下表。所以建樹文件夾時一般從左到右的分列其優先順序別如:drawable-en-rUS-land-mdpi |
res/layout/ res/layout-land/ res/layout-port/ res/layout-land-1024x720 / res/layout-port-976x768 / |
如下目錄:
layout
layout-land
layout-port
layout-land-1024x720 //1024x768橫屏
layout-port-976x768 //1024x768豎屏
註意事項:
在android3.0之前版本,要適配指定的解析度,需將layout文件夾定義成如下名稱:
layout
layout-1024x768
layout-1024x600
layout-1280x768
但是,在android3.0後,要適配如上的解析度,需將高度減去48像素,即底部狀態欄的高度,android方可識別。針對以上解析度,android4.0的layout文件夾應該定義為如下名稱:
layout
layout-1024x720
layout-1024x552
layout-1280x720
還有一種情況 如果是平板,有可能是豎屏的,需要是
layout
layout-976x768
layout-976x600
layout-976x768
格式如上。用法與正常的相同。手機會根據解析度,自己找對應的佈局,不用控制, 只需在res下按上述方式,新建對應layout就可以。 註意的是解析度中大的數字必須寫到前面,否則會產生語法錯誤。 如layout-768x1024 的寫法是錯誤的。 註意格式,【layout】-【port/land】-【長度x寬度】 如何限定橫屏或者豎屏? 有些人討厭玩手機的時候橫豎屏來回的切換,有些應用也限定了應用程式只使用橫屏或者只使用豎屏,即使手機設置了“自動切換橫豎屏”。比如“水果忍者”是不能豎屏的(雙人模式除外了) 解決辦法:只需要在AndroidManifest.xml的Activity標簽中加入:android:screenOrientation="landscape" android:screenOrientation="landscape"表示橫屏 這樣,所設定的應用程式就只能是橫屏或者豎屏了 |
res/values/
res/values-ldpi/ res/values-en-rUS/ |
可以被編譯成很多種類型的資源的XML文件。 註意: 不像其他的res/文件夾,它可以保存任意數量的文件,這些文件保存了要創建資源的描述,而不是資源本身。XML元素類型控制這些資源應該放在R類的什麼地方。 儘管這個文件夾里的文件可以任意命名,不過下麵使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中): array.xml 定義數組 colors.xml 定義color drawable和顏色的字元串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分別獲得這些資源。 dimens.xml定義尺寸值(dimension value)。使用Resources.getDimension()獲得這些資源。 strings.xml定義字元串(string)值。使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字元串上應用的豐富的文本樣式。 styles.xml 定義樣式(style)對象。
以添加一個 英語(美國):values-en-rUS 為例 1、把下麵左列表中的Region添加到左邊的列表裡面,併在Region輸入框里輸入us 2、這時,上面的消息提示:如果用Region的話,需要使用語言項,和Region一樣,我們把Language也添加到右面的列表裡面,填入en 3、點擊Finish按鈕,資源文件就會建好了,目錄:/res/values-en-rUS(其實上面一大堆操作,就是為生成這個目錄) android多國語言文件夾文件彙總如下: Arabic, Egypt (ar_EG) -----------------------------阿拉伯語,埃及 |
res/xml/ |
任意的XML文件,在運行時可以通過調用Resources.getXML()讀取。 |
res/raw/ |
直接複製到設備中的任意文件。它們無需編譯,添加到你的應用程式編譯產生的壓縮文件中。要使用這些資源,可以調用Resources.openRawResource(),參數是資源的ID,即R.raw.somefilename。 |
2.自動生成的R class
在項目文件夾的gen文件夾裡面有個R.java,我們平常引用的資源主要引用這個類的變數。 註意:R類是自動生成的,並且它不能被手動修改。當資源發生變動時,它會自動修改。3. 在代碼中使用資源
下麵是一個引用資源的語法: R.resource_type.resource_name 或者 android.R.resource_type.resource_name 其中resource_type是R的子類,保存資源的一個特定類型。resource_name是在XML文件定義的資源的name屬性,或者有其他文件類型為資源定義的文件名(不包含擴展名,這指的是drawable文件夾裡面的icon.png類似的文件,name=icon)。 Android包含了很多標準資源,如屏幕樣式和按鈕背景。要在代碼中引用這些資源,你必須使用android進行限定,如android.R.drawable.button_background。 下麵是官方給出的一些在代碼中使用已編譯資源的正確和錯誤用法的例子:- // Load a background for the current screen from a drawable resource.
- this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image);
- // WRONG Sending a string resource reference into a
- // method that expects a string.
- this.getWindow().setTitle(R.string.main_title);
- // RIGHT Need to get the title from the Resources wrapper.
- this.getWindow().setTitle(Resources.getText(R.string.main_title));
- // Load a custom layout for the current screen.
- setContentView(R.layout.main_screen);
- // Set a slide in animation for a ViewFlipper object.
- mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
- R.anim.hyperspace_in));
- // Set the text on a TextView object.
- TextView msgTextView = (TextView)findViewByID(R.id.msg);
- msgTextView.setText(R.string.hello_message);
- //在屏幕上顯示標準應用程式的圖標
- public class MyActivity extends Activity {
- public void onStart() {
- requestScreenFeatures(FEATURE_BADGE_IMAGE);
- super.onStart();
- setBadgeResource(android.R.drawable.sym_def_app_icon);
- }
- }
- //應用系統定義的標準"綠色背景"視覺處理
- public class MyActivity extends Activity
- public void onStart() {
- super.onStart();
- setTheme(android.R.style.Theme_Black);
- }
- }
4. xml文件內引用資源
1) 引用自定義的資源 android:text="@string/hello" 這裡使用"@"首碼引入對一個資源的引用--在@[package:]type/name形式中後面的文本是資源的名稱。在這種情況下,我們不需要指定包名,因為我們引用的是我們自己包中的資源。type是xml子節點名,name是xml屬性名:- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, HelloDemo!</string>
- </resources>
5. 替換資源(為了可替換的資源和配置)
個人理解這個替換資源主要用於適應多種規格的屏幕,以及國際化。對於這部分的內容,請參考http://androidappdocs.appspot.com/guide/topics/resources/resources-i18n.html,以後再研究!6. Color Value
語法:- <color name="color_name">#color_value</color>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <color name="opaque_red">#f00</color>
- <color name="translucent_red">#80ff0000</color>
- </resources>
7.Color Drawables
語法:- <drawable name="color_name">color_value</drawable>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <drawable name="opaque_red">#f00</drawable>
- <drawable name="translucent_red">#80ff0000</drawable>
- </resources>
8. 圖片
一般放在res/drawable/裡面。官方提示png (preferred), jpg (acceptable), gif (discouraged),看來一般使用png格式比較好! xml引用 @[package:]drawable/some_file java引用 R.drawable.some_file 引用是不帶擴展名9. dimension
語法:- <dimen name="dimen_name">dimen_value單位</dimen>
Java: float dimen = Resources.getDimen(R.dimen.some_name) xml示例:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <dimen name="one_pixel">1px</dimen>
- <dimen name="double_density">2dp</dimen>
- <dimen name="sixteen_sp">16sp</dimen>
- </resources>
10. string
下麵是官方給出的正確/錯誤的例子:- //不使用轉義符則需要用雙引號包住整個string
- <string name="good_example">"This'll work"</string>
- //使用轉義符
- <string name="good_example_2">This\'ll also work</string>
- //錯誤
- <string name="bad_example">This won't work!</string>
- //錯誤 不可使用html轉義字元
- <string name="bad_example_2">XML encodings won't work either!</string>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="simple_welcome_message">Welcome!</string>
- <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
- </resources>
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textAlign="center"
- android:text="@string/simple_welcome_message"/>
- // Assign a styled string resource to a TextView on the current screen.
- CharSequence str = getString(R.string.styled_welcome_message);
- TextView tv = (TextView)findViewByID(R.id.text);
- tv.setText(str);
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="search_results_resultsTextFormat">%1$d results for <b>&quot;%2$s&quot;</b></string>
- </resources>
- //title是我們想賦值給%2$s的字元串
- String escapedTitle = TextUtil.htmlEncode(title);
- String resultsTextFormat = getContext().getResources().getString(R.string.search_results_resultsTextFormat);
- String resultsText = String.format(resultsTextFormat, count, escapedTitle);
- CharSequence styledResults = Html.fromHtml(resultsText);
11. assets文件夾資源的訪問
assets文件夾裡面的文件都是保持原始的文件格式,需要用AssetManager以位元組流的形式讀取文件。 1. 先在Activity裡面調用getAssets()來獲取AssetManager引用。 2. 再用AssetManager的open(String fileName, int accessMode)方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。 3. 然後就是用已經open file 的inputStream讀取文件,讀取完成後記得inputStream.close()。 4.調用AssetManager.close()關閉AssetManager。需要註意的是,來自Resources和Assets 中的文件只可以讀取而不能進行寫的操作
以下為從Raw文件中讀取:
代碼
public String getFromRaw(){
try {
InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
}
以下為直接從assets讀取
代碼
public String getFromAssets(String fileName){
try {
InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
}
當然如果你要得到記憶體流的話也可以直接返回記憶體流!
res/raw和assets的相同點:
1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進位。
*res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾