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/ | .png、.9.png、.jpg文件,它們被編譯進以下的Drawable資源子類型中: 要獲得這種類型的一個資源,可以使用Resource.getDrawable(id) 位圖文件 9-patches(可變尺寸的位圖) 為了獲取資源類型,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在這里的圖像資源可能會被aapt工 具自動地進行無損壓縮優化。比如,一個真彩色但并不需要256色的PNG可能會被轉換為一個帶調色板的8位PNG。這使得同等質量的圖片占用更少的資源。 所以我們得意識到這些放在該目錄下的二進制圖像在生成時可能會發生變化。如果你想讀取一個圖像位流并轉換成一個位圖(bitmap),請把圖像文件放在 res/raw/目錄下,這樣可以避免被自動優化。 |
| res/layout/ | 被編譯為屏幕布局(或屏幕的一部分)的XML文件。參見布局聲明(Declaring Layout) |
| res/values/ | 可以被編譯成很多種類型的資源的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)對象。 |
| 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);??查了SDK Doc,才明白為什么window.setTitle要先Resources.getText,原來setTitle的參數是 CharSequence,Resources.getText(int)返回的是CharSequence;而其他setText的參數有的是 CharSequence,有的是int(這就是Resources變量值)。 同時官方還給了兩個使用系統資源的例子:
//在屏幕上顯示標準應用程序的圖標 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>? 2) 引用系統資源 android:textColor="@android:color/opaque_red" ? 指定package: android
3)?引用主題屬性 另外一種資源值允許你引用當前主題中的屬性的值。這個屬性值只能在樣式資源和XML屬性中使用;它允許你通過將它們改變為當前主題提供的標準變化來改變UI元素的外觀,而不是提供具體的值。 android:textColor="?android:textDisabledColor" 注意,這和資源引用非常類似,除了我們使用一個"?"前綴代替了"@"。當你使用這個標記時,你就提供了屬性資源的名稱,它將會在主題中被查 找--因為資源工具知道需要的屬性資源,所以你不需要顯示聲明這個類型(如果聲明,其形式就 是?android:attr/android:textDisabledColor)。除了使用這個資源的標識符來查詢主題中的值代替原始的資源,其命 名語法和"@"形式一致:?[namespace:]type/name,這里類型可選。
5. 替換資源(為了可替換的資源和配置)
個人理解這個替換資源主要用于適應多種規格的屏幕,以及國際化。對于這部分的內容,請參考http://androidappdocs.appspot.com/guide/topics/resources/resources-i18n.html,以后再研究!?
6. Color Value
語法:
<color?name="color_name">#color_value</color>?可以保存在res/values/colors.xml (文件名可以任意)。 xml引用:android:textColor="@color/color_name" Java引用:?int color = Resources.getColor(R.color.color_name) 其中#color_value有以下格式(A代表Alpha通道): #RGB #ARGB #RRGGBB #AARRGGBB xml示例(聲明兩個顏色,第一個不透明,第二個透明色):
<?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>?可以保存在res/values/colors.xml。 xml引用:android:background="@drawable/color_name" java引用:Drawable redDrawable = Resources.getDrawable(R.drawable.color_name) color_name和上面的一樣。個人認為,一般情況下使用color屬性,當需要用到paintDrawable時才使用drawable屬性。 xml示例:
<?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>?一般保存為res/values/dimen.xml。 度量單位:
px(象素): 屏幕實際的象素,常說的分辨率1024*768pixels,就是橫向1024px, 縱向768px,不同設備顯示效果相同。
in(英寸): 屏幕的物理尺寸, 每英寸等于2.54厘米。
mm(毫米): 屏幕的物理尺寸。
pt(點)? : 屏幕的物理尺寸。1/72英寸。
dp/dip? : 與密度無關的象素,一種基于屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。但dp和px的比例會隨著屏幕密度的變化而改變,不同設備有不同的顯示效果。
sp????? : 與刻度無關的象素,主要用于字體顯示best for textsize,作為和文字相關大小單位。 XML: android:textSize="@dimen/some_name"
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>?對于帶格式的string,例如在字符串中某些文字設置顏色,可以使用html標簽。對于這類型的string,需要進行某些處理,在xml里面不可以被其他資源引用。官方給了一個例子來對比普通string和帶格式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>?Xml代碼
<TextView? ????android:layout_width="fill_parent"? ????android:layout_height="wrap_content"? ????android:textAlign="center"? ????android:text="@string/simple_welcome_message"/>?Java代碼
//?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);?另外對于帶風格/格式的string的處理,就麻煩一點點。官方給了一個例子:
<?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>?這里的%1$d是個十進制數字,%2$s是字符串。當我們把某個字符串賦值給%2$s之前,需要用
htmlEncode(String)函數處理那個字符串:
//title是我們想賦值給%2$s的字符串? String?escapedTitle?=?TextUtil.htmlEncode(title);?然后用String.format() 來實現賦值,接著用fromHtml(String) 得到格式化后的string:
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();?
??????????? }
??? }?
當然如果你要得到內存流的話也可以直接返回內存流! 本文來自 http://blog.sina.com.cn/s/blog_7161d18a0100o7go.html
轉載于:https://www.cnblogs.com/luxiaofeng54/archive/2011/03/15/1984617.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的android 从assets和res中读取文件(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。