【收藏】MyBatis 常用語法匯總
848
2025-04-04
應用資源概覽
資源是指代碼使用的附加文件和靜態內容,例如位圖、布局定義、界面字符串、動畫說明等。
您應始終外部化應用資源(例如圖像和代碼中的字符串),以便單獨對其進行維護。此外,您還應為特定設備配置提供備用資源,方法是將其進行分組并放入專門命名的資源目錄中。在運行時,Android 會根據當前配置使用合適的資源。例如,您可能需根據屏幕尺寸提供不同的界面布局,或根據語言設置提供不同的字符串。
外部化應用資源后,您便可使用在項目 R 類中生成的資源 ID 來訪問這些資源。本文檔會介紹如何對 Android 項
分組資源類型
您應將各類資源放入項目 res/ 目錄的特定子目錄中。例如,以下是一個簡單項目的文件層次結構:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
如此示例所示,res/ 目錄包含所有資源(在子目錄中):一個圖像資源、兩個布局資源、啟動器圖標的 mipmap/ 目錄以及一個字符串資源文件。資源目錄名稱非常重要,具體說明請見表 1。
**請注意:**如需了解有關使用 mipmap 文件夾的詳細信息,請參閱管理項目概覽。意:**切勿將資源文件直接保存在 res/ 目錄內,因為這樣會造成編譯錯誤。
如需了解有關特定資源類型的詳細信息,請參閱資源類型文檔。
在表 1 定義的子目錄中,保存的資源為“默認”資源。換言之,這些資源定義應用的默認設計和內容。然而,不同類型的 Android 設備可能需要不同類型的資源。例如,如果設備屏幕比標準屏幕大,則應提供不同的布局資源,從而充分利用額外的屏幕空間。或者,如果設備的語言設置不同,則應提供不同的字符串資源,以便將界面中的文本轉換為其他語言。如要為不同設備配置提供這些不同資源,除默認資源以外,您還需提供備用資源。
提供備用資源
幾乎每個應用都應提供備用資源,以便支持特定的設備配置。例如,對于不同的屏幕密度和語言,您應分別加入備用可繪制對象資源和備用字符串資源。在運行時,Android 會檢測當前設備配置并為應用加載合適的資源。
圖 1. 兩種不同的設備,均使用不同的布局資源。
為一組資源指定配置特定的備用資源:
在
res/
中創建以
形式命名的新目錄。
您可以追加多個
**注意:**追加多個限定符時,必須按照表 2 中列出的相同順序放置限定符。如果限定符的順序錯誤,則該資源將被忽略。
將相應的備用資源保存在此新目錄下。這些資源文件必須與默認資源文件完全同名。
例如,以下是一些默認資源和備用資源:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
hdpi 限定符表示該目錄中的資源適用于屏幕密度較高的設備。其中,每個可繪制對象目錄中的圖像均已針對特定的屏幕密度調整了大小,但文件名完全相同。如此一來,用于引用 icon.png 或 background.png 圖像的資源 ID 始終相同,但 Android 會通過將設備配置信息與資源目錄名稱中的限定符進行比較,選擇最符合當前設備的各個資源版本。
Android 支持若干配置限定符,您可以通過使用短劃線分隔每個限定符,從而向一個目錄名稱添加多個限定符。表 2 按優先級順序列出了有效的配置限定符;如果對資源目錄使用多個限定符,則必須按照表中所列順序將其添加到目錄名稱中。
**請注意:**自 Android 1.0 起便已添加部分配置限定符,因此并非所有版本的 Android 系統都支持所有限定符。使用新限定符會隱式添加平臺版本限定符,因此較舊版本系統的設備必然會忽略它。例如,使用 w600dp 限定符會自動包括 v13 限定符,因為可用寬度限定符是 API 級別 13 中的新增配置。為避免出現任何問題,請始終包含一組默認資源(一組不帶限定符的資源)。如需了解詳細信息,請參閱利用資源提供最佳設備兼容性部分。
限定符命名規則
以下是一些關于使用配置限定符名稱的規則:
您可以為單組資源指定多個限定符,并使用短劃線分隔。例如,drawable-en-rUS-land 適用于屏幕方向為橫向的美國英語設備。
這些限定符必須遵循中列出的順序。例如:
錯誤:drawable-hdpi-port/
正確:drawable-port-hdpi/
不能嵌套備用資源目錄。例如,您的目錄不能為 res/drawable/drawable-en/。
值不區分大小寫。在處理之前,資源編譯器會將目錄名稱轉換為小寫,以免不區分大小寫的文件系統出現問題。名稱中使用的所有大寫字母只是為了便于認讀。
每種限定符類型僅支持一個值。例如,若要對西班牙語和法語使用相同的可繪制對象文件,則您不能擁有名為 drawable-rES-rFR/ 的目錄,而是需要兩個包含相應文件的資源目錄,如 drawable-rES/ 和 drawable-rFR/。然而,您實際無需在兩處復制相同的文件。相反,您可以創建指向資源的別名。請參閱下面的創建別名資源。
在將備用資源保存到以這些限定符命名的目錄中后,Android 會根據當前設備配置在應用中自動應用這些資源。每次請求資源時,Android 都會檢查備用資源目錄是否包含所請求的資源文件,然后查找最佳匹配資源(下文進行介紹)。如果沒有與特定設備配置相匹配的備用資源,則 Android 會使用相應的默認資源(一組用于不含配置限定符的特定資源類型的資源)。
創建別名資源
如果您想將某一資源用于多種設備配置(但不想以默認資源的形式提供該資源),則無需將同一資源放入多個備用資源目錄中。相反,您可以(在某些情況下)創建備用資源,充當默認資源目錄中所保存資源的別名。
**請注意:**并非所有資源都會提供相應機制,以便您創建指向其他資源的別名。特別是,xml/ 目錄中的動畫資源、菜單資源、原始資源及其他未指定資源均不提供此功能。
例如,假設您有一個應用圖標 icon.png,并且需要用于不同語言區域的獨特版本。但是,加拿大英語和加拿大法語這兩種語言區域需使用同一版本。您可能會認為,需要將相同圖像復制到加拿大英語和加拿大法語所對應的資源目錄中,但事實并非如此。相反,您可以將用于二者的圖像保存為 icon_ca.png(除 icon.png 以外的任何名稱),并將其放入默認的 res/drawable/ 目錄中。然后,在 res/drawable-en-rCA/ 和 res/drawable-fr-rCA/ 中創建 icon.xml 文件,使用
如要創建指向現有可繪制對象的別名,請使用
如果將此文件保存為 drawables.xml(例如,在備用資源目錄中保存為 res/values-en-rCA/),則系統會將其編譯到可作為 R.drawable.icon 引用的資源中,但該文件實際是 R.drawable.icon_ca 資源(保存在 res/drawable/ 中)的別名。
如要創建指向現有布局的別名,請使用包裝在
如果將此文件保存為 main.xml,則系統會將其編譯到可作為 R.layout.main 引用的資源中,但該文件實際是 R.layout.main_ltr 資源的別名。
如要創建指向現有字符串的別名,您只需將所需字符串的資源 ID 用作新字符串的值。例如:
R.string.hi 資源現在是 R.string.hello 的別名。
其他簡單值的原理相同。例如,顏色:
訪問應用資源
在應用中提供資源后,您可通過引用其資源 ID 來應用該資源。所有資源 ID 都在您項目的 R 類中進行定義,該類由 aapt 工具自動生成。
編譯應用時,aapt 會生成 R 類,其中包含 res/ 目錄中所有資源的資源 ID。每個資源類型都有對應的 R 子類(例如,R.drawable 對應所有可繪制對象資源),而該類型的每個資源都有對應的靜態整型數(例如,R.drawable.icon)。該整型數就是可用來檢索資源的資源 ID。
盡管資源 ID 是在 R 類中指定的,但您完全不需要在該類中查找資源 ID。資源 ID 始終由以下部分組成:
資源類型:每個資源都被分到一個“類型”組中,例如 string、drawable 和 layout。如需了解有關不同類型的詳細信息,請參閱資源類型。
資源名稱,它是不包括擴展名的文件名;或是 XML android:name 屬性中的值(如資源是字符串等簡單值)。
訪問資源的方法有兩種:
在代碼中:
使用來自
R
類子類的靜態整型數,例如:
R.string.hello
string 為資源類型,hello 為資源名稱。當您提供此格式的資源 ID 時,有許多 Android API 可以訪問您的資源。請參閱在代碼中訪問資源。
在 XML 中:
使用同樣與
R
類中所定義資源 ID 對應的特殊 XML 語法,例如:
@string/hello
string 為資源類型,hello 為資源名稱。只要 XML 資源中的某處擁有您在資源中提供的值,則您便可在該 XML 資源中使用此語法。請參閱在 XML 中訪問資源。
在代碼中訪問資源
您可以以方法參數的形式傳遞資源 ID,進而在代碼中使用資源。例如,您可以設置一個 ImageView,從而借助 setImageResource() 使用 res/drawable/myimage.png 資源:
val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)
您還可利用 Resources 中的方法檢索個別資源,并且您可通過 getResources() 獲得該資源的實例。
以下是在代碼中引用資源的語法:
[
如需了解有關各資源類型及其引用方法的詳細信息,請參閱資源類型。
許多方法可接受資源 ID 參數,您可利用 Resources 中的方法檢索資源。您可以通過 Context.getResources() 獲得 Resources 的實例。
以下是一些在代碼中訪問資源的示例:
// Load a background for the current screen from a drawable resource window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID window.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 by getting an Animation from the Resources object flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)
**注意:**切勿手動修改 R.java 文件 — 在您編譯項目時,aapt 工具會生成該文件。下次編譯時,所有更改都會被覆蓋。
在 XML 中訪問資源
您可以使用對現有資源的引用,為某些 XML 屬性和元素定義值。創建布局文件時,為給您的微件提供字符串和圖像,您會經常這樣做。
例如,如果您為布局添加 Button,則應為按鈕文本使用字符串資源:
以下是在 XML 資源中引用資源的語法:
@[
如需了解有關各資源類型及其引用方法的詳細信息,請參閱資源類型。
在某些情況下,您必須使用資源作為 XML 中的值(例如,對微件應用可繪制圖像),但您也可在 XML 中任何接受簡單值的地方使用資源。例如,如果您擁有以下資源文件,其中包括一個顏色資源和一個字符串資源:
您可以在以下布局文件中使用這些資源來設置文本顏色和文本字符串:
在此情況下,您無需在資源引用中指定包名稱,因為資源來自您自己的資源包。如要引用系統資源,則您需要加入包名稱。例如:
**請注意:**您應始終使用字符串資源,以便將您的應用本地化為其他語言。如需了解有關創建備用資源(例如本地化字符串)的信息,請參閱提供備用資源。如需查看將應用本地化為其他語言的完整指南,請參閱本地化。
您甚至可以在 XML 中使用資源創建別名。例如,您可以創建一個可繪制對象資源,將其作為另一個可繪制對象資源的別名:
這聽起來多余,但對使用備用資源可能很有幫助。閱讀更多關于創建別名資源的內容。
利用樣式屬性資源,您可以在當前應用的主題背景中引用某個屬性的值。借助引用樣式屬性,在自定義界面元素的外觀時,您無需采用提供硬編碼值這種方式,您可以通過為其設置樣式,以匹配當前主題背景提供的標準變體來達成目的。引用樣式屬性的實質作用是,“在當前主題背景中使用此屬性定義的樣式”。
如要引用樣式屬性,名稱語法幾乎與普通資源格式完全相同,區別在于您需將 at 符號 (@) 改為問號 (?),并且資源類型部分為可選項。例如:
?[
例如,以下代碼展示了如何通過引用屬性來設置文本顏色設,使其匹配系統主題背景的“基本”文本顏色:
在以上代碼中,android:textColor 屬性指定當前主題背景中某個樣式屬性的名稱。Android 現在會將應用于 android:textColorSecondary 樣式屬性的值用作此微件中 android:textColor 的值。由于系統資源工具知道此環境中肯定存在某個屬性資源,因此您無需顯式聲明類型(類型應為 ?android:attr/textColorSecondary)— 您可以將 attr 類型排除在外。
訪問原始文件
盡管并不常見,但您的確有可能需要訪問原始文件和目錄。如果確有需要,則將文件保存在 res/ 中并沒有用,因為從 res/ 讀取資源的唯一方法是使用資源 ID。您可以改為將資源保存在 assets/ 目錄中。
保存在 assets/ 目錄中的文件沒有資源 ID,因此您無法通過 R 類或在 XML 資源中引用它們。您可以改為采用類似普通文件系統的方式查詢 assets/ 目錄中的文件,并利用 AssetManager 讀取原始數據。
不過,如果您只需要讀取原始數據(例如視頻文件或音頻文件)的能力,則可將文件保存在 res/raw/ 目錄中,并利用 openRawResource() 讀取字節流。
訪問平臺資源
Android 包含許多標準資源,例如樣式、主題背景和布局。如要訪問這些資源,請通過 android 包名稱限定您的資源引用。例如,您可以將 Android 提供的布局資源用于 ListAdapter 中的列表項:
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
在上例中,simple_list_item_1 是平臺為 ListView 中的項目所定義的布局資源。您可以使用該資源,而不必自行創建列表項布局。
利用資源提供最佳設備兼容性
為使應用支持多種設備配置,請務必為應用使用的每種資源類型提供默認資源,這一點非常重要。
例如,如果應用支持多種語言,請始終包含不帶語言和區域限定符的 values/ 目錄(用于保存字符串)。相反,如果您將所有字符串文件放入帶有語言和區域限定符的目錄中,且設備語言已設為您的字符串所不支持的語言,則應用在該設備上運行時將崩潰。但是,只要提供默認 values/ 資源,應用便會正常運行(即使用戶不理解該語言,但總比崩潰要好)。
同樣,如果您根據屏幕方向提供不同的布局資源,則應選擇一個方向作為默認方向。例如,不要在 layout-land/ 和 layout-port/ 中分別提供橫向和縱向的布局資源,而是保留其一作為默認設置,例如:layout/ 用于橫向,layout-port/ 用于縱向。
提供默認資源至關重要,這不僅是因為應用可能會在超出預期的配置上運行,也因為新版 Android 有時會添加舊版本不支持的配置限定符。如果您使用新的資源限定符,但希望維持對舊版 Android 的代碼兼容性,則當舊版 Android 運行應用時,應用將在無默認資源的情況下崩潰,因為此時它無法使用以新限定符命名的資源。例如,如果您將 minSdkVersion 設置為 4,并使用夜間模式(night 或 notnight,API 級別 8 中的新增配置)限定所有可繪制對象資源,則 API 級別 4 設備無法訪問可繪制對象資源,而且會崩潰。在此情況下,您可能希望 notnight 成為默認資源,所以您應排除該限定符,使可繪制對象資源位于 drawable/ 或 drawable-night/ 中。
因此,為提供最佳的設備兼容性,請始終為應用正確運行所需的資源提供默認資源。然后,請使用配置限定符為特定的設備配置創建備用資源。
這條規則有一個例外:如果應用的 minSdkVersion 為 4 或更高版本,則在提供帶屏幕密度限定符的備用可繪制對象資源時,您不需要默認可繪制對象資源。即使沒有默認可繪制對象資源,Android 也可從備用屏幕密度中找到最佳匹配項并根據需要縮放位圖。但是,為了在所有類型的設備上提供最佳體驗,您應為所有三種類型的密度提供備用可繪制對象。
Android 如何查找最佳匹配資源
當您請求要為其提供備用資源的資源時,Android 會根據當前的設備配置選擇要在運行時使用的備用資源。為演示 Android 如何選擇備用資源,假設以下可繪制對象目錄分別包含相同圖像的不同版本:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
同時,假設設備配置如下:
語言區域 = en-GB
屏幕方向 = port
屏幕像素密度 = hdpi
觸摸屏類型 = notouch
主要文本輸入法 = 12key
通過將設備配置與可用的備用資源進行比較,Android 會從 drawable-en-port 中選擇可繪制對象。
系統使用以下邏輯決定要使用的資源:
圖 2. Android 如何查找最佳匹配資源的流程圖。
淘汰與設備配置沖突的資源文件。
drawable-fr-rCA/ 目錄與 en-GB 語言區域沖突,因而被淘汰。
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
**例外:**屏幕像素密度是唯一一個未因沖突而被淘汰的限定符。盡管設備的屏幕密度為 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因為此時每個屏幕密度均視為匹配。如需了解詳細信息,請參閱支持多種屏幕文檔。
選擇列表(表 2)中(下一個)優先級最高的限定符。(從 MCC 開始,然后向下移動。)
是否有資源目錄包含此限定符?
若無,請返回到第 2 步,看看下一個限定符。(在該示例中,除非到達語言限定符,否則答案始終為“否”。)
若有,請繼續執行第 4 步。
淘汰不含此限定符的資源目錄。在該示例中,系統會淘汰所有不含語言限定符的目錄:
drawable/ drawable-en/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
**例外:**如果問題中的限定符是屏幕像素密度,則 Android 會選擇最接近設備屏幕密度的選項。一般來說,Android 偏向于縮小較大的原始圖像,而非放大較小的原始圖像。請參閱支持多種屏幕。
返回并重復第 2 步、第 3 步和第 4 步,直到僅剩一個目錄為止。在此示例中,屏幕方向是下一個判斷是否匹配的限定符。因此,系統會淘汰未指定屏幕方向的資源:
drawable-en/ drawable-en-port/ drawable-en-notouch-12key/
剩下的目錄是 drawable-en-port。
盡管系統會對所請求的每個資源執行此程序,但是其仍會對某些方面做進一步優化。例如,已知設備配置后,系統會淘汰可能永遠無法匹配的備用資源。比如,如果配置語言是英語(“en”),則系統絕不會將語言限定符設置為非英語的任何資源目錄加入選中的資源池(不過,仍會將不帶語言限定符的資源目錄加入該池)。
在根據屏幕尺寸限定符選擇資源時,如果沒有更好的匹配資源,則系統將使用專為小于當前屏幕的屏幕而設計的資源(例如,必要時,大尺寸屏幕將使用標準尺寸的屏幕資源)。但是,如果唯一可用的資源大于當前屏幕,則系統不會使用這些資源,并且如果沒有其他資源與設備配置匹配,應用將會崩潰(例如,如果所有布局資源均用 xlarge 限定符標記,但設備是標準尺寸的屏幕)。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。