Android資源文件

應(yīng)用資源是指應(yīng)用中與源代碼分離的資源永毅,如圖像、音頻文件以及任何與應(yīng)用的視覺呈現(xiàn)有關(guān)的內(nèi)容人弓。在Android項目中的每一項資源沼死,SDK構(gòu)建工具都會定義一個唯一的整形ID,可以通過ID對資源進行應(yīng)用票从。提供與源代碼分離的資源的其中一個最重要優(yōu)點在于漫雕,您可以提供針對不同設(shè)備配置的備用資源滨嘱。

1、應(yīng)用資源分組

項目res/目錄下支持的資源目錄

目錄 資源類型
animator/ 定義屬性動畫的xml文件
anim/ 定義漸變動畫的XML文件
color/ 定義顏色狀態(tài)列表的XML文件
drawable/ 位圖文件(.png浸间、.9.png太雨、.jpg、.gif)
values/ 包含字符串魁蒜、整型數(shù)和顏色等簡單值的 XML 文件囊扳。
mipmap/ 適用于不同啟動器圖標(biāo)密度的可繪制對象文件。
layout/ 用于定義用戶界面布局的XML文件
menu/ 用于定義應(yīng)用菜單(如選項菜單兜看、上下文菜單或子菜單)的 XML 文件锥咸。
raw/ 要以原始形式保存的任意文件,要以原始的InputStream打開這些資源
xml/ 可以在運行時通過調(diào)用 Resources.getXML() 讀取的任意 XML 文件细移。各種 XML 配置文件(如可搜索配置)都必須保存在此處

values/目錄下的資源

其他 res/ 子目錄中的 XML 資源文件是根據(jù) XML 文件名定義單個資源搏予,而 values/ 目錄中的文件可描述多個資源。對于此目錄中的文件弧轧,<resources> 元素的每個子元素均定義一個資源雪侥。例如,<string> 元素創(chuàng)建 R.string 資源精绎,<color> 元素創(chuàng)建 R.color 資源速缨。

目錄 資源類型
arrays.xml 用于資源數(shù)組(類型化數(shù)組)
color.xml 顏色值
dimens.xml 尺寸值
string.xml 字符串值
styles.xml 樣式

2、備用資源

幾乎每個應(yīng)用都應(yīng)提供備用資源以支持特定的設(shè)備配置代乃。 例如旬牲,對于不同的屏幕密度和語言,應(yīng)分別包括備用可繪制對象資源和備用字符串資源搁吓。 在運行時原茅,Android 會檢測當(dāng)前設(shè)備配置并為應(yīng)用加載合適的資源。

  1. 在res/中創(chuàng)建一個以resources_name + config_qualifier形式命名的新目錄堕仔。
    • resources_name: 是相應(yīng)默認資源的目錄名稱
    • qualifier: 是指定要使用這些資源的各個配置的名稱
  2. 將相應(yīng)的備用資源保存在此新目錄下员咽。這些資源文件的名稱必須與默認資源文件完全一樣。

例如hdpi限定符表示該目錄中的資源適用于屏幕密度較高的設(shè)備贮预。其中每個可繪制對象目錄中的圖像已經(jīng)針對特定的屏幕密度調(diào)整大小贝室,但是文件名完全相同。這樣一來用于圖像資源的ID始終相同仿吞,但是Android系統(tǒng)會通過將設(shè)備配置信息與資源目錄名稱中的限定符進行比較滑频,選擇最符合當(dāng)前設(shè)備的各個資源版本。詳細可見官方文檔

限定符命名規(guī)則

  1. 單組資源可以指定多個限定符唤冈,并使用短劃線分隔峡迷。
  2. 不能嵌套備用資源目錄。
  3. 命名中的值不區(qū)分大小寫。
  4. 對于每種限定符類型绘搞,僅支持一個值彤避。

將備用資源保存到以這些限定符命名的目錄中之后,Android 會根據(jù)當(dāng)前設(shè)備配置在應(yīng)用中自動應(yīng)用這些資源夯辖。 每次請求資源時琉预,Android 都會檢查備用資源目錄是否包含所請求的資源文件,然后查找最佳匹配資源蒿褂。 如果沒有與特定設(shè)備配置匹配的備用資源圆米,則 Android 會使用相應(yīng)的默認資源(一組用于不含配置限定符的特定資源類型的資源)。

以下為系統(tǒng)決定使用哪個資源文件夾的邏輯

image

3啄栓、處理運行時變更

有些設(shè)備配置可能在運行時發(fā)生變化娄帖。此時,Android系統(tǒng)會重啟正在運行的Activity(先后調(diào)用onDestroy()和onCreate()方法)昙楚。重啟行為旨在通過利用與新設(shè)備配置匹配的備用資源自動重新加載您的應(yīng)用近速,來幫助它適應(yīng)新配置。對于Activity中數(shù)據(jù)可以在銷毀時通過onSaveInstanceState()進行保存堪旧,重啟時通過onRestoreInstanceState()恢復(fù)數(shù)據(jù)数焊,但是這樣的處理方式成本高昂,會給用戶留下糟糕的使用體驗崎场。

在配置變更期間保留對象

如果 Activity 因配置變更而重啟,則可通過保留 Fragment 來減輕重新初始化 Activity 的負擔(dān)遂蛀。此片段可能包含對您要保留的有狀態(tài)對象的引用谭跨。

當(dāng) Android 系統(tǒng)因配置變更而關(guān)閉 Activity 時,不會銷毀您已標(biāo)記為要保留的 Activity 的片段李滴。 您可以將此類片段添加到 Activity 以保留有狀態(tài)的對象螃宙。

  1. 擴展Fragment類并聲明對有狀態(tài)的對象的引用
  2. 在創(chuàng)建片段后調(diào)用saveRetainInstance(boolean)
  3. 將片段添加到Activity中
  4. 重啟Activity后,使用FragmentManager檢索片段
public class RetainedFragment extends Fragment {

    // data object we want to retain
    private MyDataObject data;

    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }

    public void setData(MyDataObject data) {
        this.data = data;
    }

    public MyDataObject getData() {
        return data;
    }
}

使用 FragmentManager 將片段添加到 Activity所坯。在運行時配置變更期間再次啟動 Activity 時谆扎,您可以獲得片段中的數(shù)據(jù)對象。

public class MyActivity extends Activity {

    private RetainedFragment retainedFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the retained fragment on activity restarts
        FragmentManager fm = getFragmentManager();
        retainedFragment = (RetainedFragment) fm.findFragmentByTag(“data”);

        // create the fragment and data the first time
        if (retainedFragment == null) {
            // add the fragment
            retainedFragment = new RetainedFragment();
            fm.beginTransaction().add(retainedFragment, “data”).commit();
            // load the data from the web
            retainedFragment.setData(loadMyData());
        }

        // the data is available in retainedFragment.getData()
        ...
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // store the data in the fragment
        retainedFragment.setData(collectMyLoadedData());
    }
}

自行處理配置更新

如果應(yīng)用在特定配置變更期間無需更新資源芹助,并且因性能限制您需要盡量避免重啟堂湖,則可聲明 Activity 將自行處理配置變更向族,這樣可以阻止系統(tǒng)重啟 Activity樟结。要聲明由 Activity 處理配置變更,請在清單文件中編輯相應(yīng)的 <activity> 元素檀轨,以包含 android:configChanges 屬性以及代表要處理的配置的值蒙谓〕饧荆可以在該屬性中聲明多個配置值,通過“|”字符分隔這些配置值。

當(dāng)其中一個配置發(fā)生變化時酣倾,Activity不會重啟舵揭。而是,Activity會收到一個對onConfigrationChanged()的調(diào)用躁锡。這個方法會有一個Configration對象的參數(shù)指定對新設(shè)備的配置午绳,可以通過對Configration中的字段確定新配置。調(diào)用此方法時稚铣,Activity 的 Resources 對象會相應(yīng)地進行更新箱叁,以根據(jù)新配置返回資源,這樣惕医,您就能夠在系統(tǒng)不重啟 Activity 的情況下輕松重置 UI 的元素耕漱。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抬伺,隨后出現(xiàn)的幾起案子螟够,更是在濱河造成了極大的恐慌,老刑警劉巖峡钓,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓笙,死亡現(xiàn)場離奇詭異,居然都是意外死亡能岩,警方通過查閱死者的電腦和手機寞宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拉鹃,“玉大人辈赋,你說我怎么就攤上這事「嘌啵” “怎么了钥屈?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坝辫。 經(jīng)常有香客問我篷就,道長,這世上最難降的妖魔是什么近忙? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任竭业,我火速辦了婚禮,結(jié)果婚禮上及舍,老公的妹妹穿的比我還像新娘永品。我一直安慰自己,他們只是感情好击纬,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布鼎姐。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炕桨。 梳的紋絲不亂的頭發(fā)上饭尝,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音献宫,去河邊找鬼钥平。 笑死,一個胖子當(dāng)著我的面吹牛姊途,可吹牛的內(nèi)容都是我干的涉瘾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼捷兰,長吁一口氣:“原來是場噩夢啊……” “哼立叛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贡茅,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤秘蛇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后顶考,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赁还,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年驹沿,在試婚紗的時候發(fā)現(xiàn)自己被綠了艘策。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡渊季,死狀恐怖朋蔫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梭域,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布搅轿,位于F島的核電站病涨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏璧坟。R本人自食惡果不足惜既穆,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雀鹃。 院中可真熱鬧幻工,春花似錦、人聲如沸黎茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踢代,卻和暖如春盲憎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胳挎。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工饼疙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慕爬。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓窑眯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親医窿。 傳聞我的和親對象是個殘疾皇子磅甩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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

  • 一直以來對于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時候都戰(zhàn)戰(zhàn)兢兢留搔,終于忍無可忍更胖,無需再忍,決定掏出官方文...
    李小神不偷懶閱讀 3,773評論 4 5
  • 1隔显、layout的命名方式:(盡量帶上模塊名) Activity的layout以module_activity開頭...
    Yangxy_Lazy閱讀 988評論 0 0
  • assets和raw目錄中資源的區(qū)別 相同點 在打包生成的apk中兩者目錄下的文件都保持原始的文件格式却妨,不會被編譯...
    shellever閱讀 1,265評論 0 2
  • Activity 是一個應(yīng)用組件,用戶可與其提供的屏幕進行交互括眠,以執(zhí)行撥打電話彪标、拍攝照片、發(fā)送電子郵件或查看地圖等...
    RxCode閱讀 885評論 0 0
  • 心情總被別人左右掷豺!很悲催捞烟。 今天遇見一件事,讓人揪心扯肺当船,不能釋懷题画。 一名清潔工凌晨四點多...
    75eab3043e61閱讀 67評論 0 0