1page.title=Cung cấp Tài nguyên 2parent.title=Tài nguyên Ứng dụng 3parent.link=index.html 4@jd:body 5 6<div id="qv-wrapper"> 7<div id="qv"> 8 <h2>Xem nhanh</h2> 9 <ul> 10 <li>Các loại tài nguyên khác nhau thuộc về các thư mục con khác nhau của {@code res/}</li> 11 <li>Tài nguyên thay thế cung cấp các tệp tài nguyên theo cấu hình cụ thể</li> 12 <li>Luôn bao gồm tài nguyên mặc định để ứng dụng của bạn không phụ thuộc vào các 13cấu hình thiết bị cụ thể</li> 14 </ul> 15 <h2>Trong tài liệu này</h2> 16 <ol> 17 <li><a href="#ResourceTypes">Nhóm các Loại Tài nguyên lại</a></li> 18 <li><a href="#AlternativeResources">Cung cấp Tài nguyên Thay thế</a> 19 <ol> 20 <li><a href="#QualifierRules">Quy tắc về tên hạn định</a></li> 21 <li><a href="#AliasResources">Tạo tài nguyên bí danh</a></li> 22 </ol> 23 </li> 24 <li><a href="#Compatibility">Cung cấp Tính tương thích giữa Thiết bị với Tài nguyên Tốt nhất</a></li> 25 <li><a href="#BestMatch">Cách Android tìm Tài nguyên Khớp Tốt nhất</a></li> 26 </ol> 27 28 <h2>Xem thêm</h2> 29 <ol> 30 <li><a href="accessing-resources.html">Truy cập Tài nguyên</a></li> 31 <li><a href="available-resources.html">Loại Tài nguyên</a></li> 32 <li><a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ Nhiều 33Màn hình</a></li> 34 </ol> 35</div> 36</div> 37 38<p>Bạn nên luôn ngoại hiện hóa các tài nguyên ứng dụng chẳng hạn như hình ảnh và xâu từ mã 39của mình, sao cho bạn có thể duy trì chúng một cách độc lập. Bạn cũng nên cung cấp tài nguyên thay thế cho 40cấu hình thiết bị cụ thể bằng cách nhóm chúng lại trong những thư mục tài nguyên đích danh. Trong 41thời gian chạy, Android sẽ sử dụng tài nguyên phù hợp dựa trên cấu hình hiện tại. Ví 42dụ, bạn có thể muốn cung cấp một bố trí UI khác phụ thuộc vào kích cỡ màn hình hoặc các xâu 43khác nhau phụ thuộc vào thiết đặt ngôn ngữ.</p> 44 45<p>Sau khi ngoại hiện hóa các tài nguyên ứng dụng của mình, bạn có thể truy cập chúng 46bằng cách sử dụng các ID tài nguyên được khởi tạo trong lớp {@code R} của dự án của bạn. Cách sử dụng 47tài nguyên trong ứng dụng của bạn được trình bày trong phần <a href="accessing-resources.html">Truy cập 48Tài nguyên</a>. Tài liệu này trình bày với bạn cách nhóm các tài nguyên lại trong dự án Android của bạn và 49cung cấp tài nguyên thay thế cho những cấu hình thiết bị cụ thể.</p> 50 51 52<h2 id="ResourceTypes">Nhóm các Loại Tài nguyên lại</h2> 53 54<p>Bạn nên đặt từng loại tài nguyên vào một thư mục con cụ thể trong thư mục 55{@code res/} dự án của mình. Ví dụ, sau đây là phân cấp tệp của một dự án đơn giản:</p> 56 57<pre class="classic no-pretty-print"> 58MyProject/ 59 src/ <span style="color:black"> 60 MyActivity.java </span> 61 res/ 62 drawable/ <span style="color:black"> 63 graphic.png </span> 64 layout/ <span style="color:black"> 65 main.xml 66 info.xml</span> 67 mipmap/ <span style="color:black"> 68 icon.png </span> 69 values/ <span style="color:black"> 70 strings.xml </span> 71</pre> 72 73<p>Như bạn có thể thấy trong ví dụ này, thư mục {@code res/} chứa tất cả tài nguyên (trong 74các thư mục con): một tài nguyên hình ảnh, hai tài nguyên bố trí, các thư mục{@code mipmap/} cho biểu tượng của trình khởi chạy 75, và một tệp tài nguyên xâu. Tên thư mục 76tài nguyên có vai trò quan trọng và được mô tả trong bảng 1.</p> 77 78<p class="note"><strong>Lưu ý:</strong> Để biết thêm thông tin về cách sử dụng thư mục mipmap, hãy xem phần 79<a href="{@docRoot}tools/projects/index.html#mipmap">Tổng quan về Quản lý Dự án</a>.</p> 80 81<p class="table-caption" id="table1"><strong>Bảng 1.</strong> Các thư mục tài nguyên 82được hỗ trợ bên trong thư mục {@code res/} của dự án.</p> 83 84<table> 85 <tr> 86 <th scope="col">Thư mục</th> 87 <th scope="col">Loại Tài nguyên</th> 88 </tr> 89 90 <tr> 91 <td><code>animator/</code></td> 92 <td>Tệp XML định nghĩa <a href="{@docRoot}guide/topics/graphics/prop-animation.html">các hoạt hình 93tính chất</a>.</td> 94 </tr> 95 96 <tr> 97 <td><code>anim/</code></td> 98 <td>Tệp XML định nghĩa <a href="{@docRoot}guide/topics/graphics/view-animation.html#tween-animation">các hoạt hình 99tween</a>. (Các hoạt hình tính chất cũng có thể được lưu trong thư mục này, nhưng 100thư mục {@code animator/} được ưu tiên cho hoạt hình tính chất để phân biệt giữa hai 101loại này.)</td> 102 </tr> 103 104 <tr> 105 <td><code>color/</code></td> 106 <td>Tệp XML định nghĩa một danh sách trạng thái các màu. Xem phần <a href="color-list-resource.html">Tài nguyên 107Danh sách Trạng thái Màu</a></td> 108 </tr> 109 110 <tr> 111 <td><code>drawable/</code></td> 112 113 <td><p>Tệp bitmap ({@code .png}, {@code .9.png}, {@code .jpg}, {@code .gif}) hoặc tệp XML 114được biên dịch thành các loại tài nguyên con vẽ được sau:</p> 115 <ul> 116 <li>Tệp bitmap</li> 117 <li>Nine-Patche (tệp bitmap có thể thay đổi kích cỡ)</li> 118 <li>Danh sách trạng thái</li> 119 <li>Hình</li> 120 <li>Nội dung vẽ được hoạt hình</li> 121 <li>Nội dung vẽ được khác</li> 122 </ul> 123 <p>Xem phần <a href="drawable-resource.html">Tài nguyên Vẽ được</a>.</p> 124 </td> 125 </tr> 126 127 <tr> 128 <td><code>mipmap/</code></td> 129 <td>Tệp vẽ được cho các mật độ biểu tượng trình khởi chạy khác nhau. Để biết thêm thông tin về việc quản lý 130 các biểu tượng trình khởi chạy bằng thư mục {@code mipmap/}, xem phần 131 <a href="{@docRoot}tools/project/index.html#mipmap">Tổng quan về Quản lý Dự án</a>.</td> 132 </tr> 133 134 <tr> 135 <td><code>layout/</code></td> 136 <td>Tệp XML định nghĩa một bố trí giao diện người dùng. 137 Xem phần <a href="layout-resource.html">Tài nguyên Bố trí</a>.</td> 138 </tr> 139 140 <tr> 141 <td><code>menu/</code></td> 142 <td>Tệp XML định nghĩa các menu ứng dụng, chẳng hạn như Menu Tùy chọn, Menu Ngữ cảnh, hoặc Menu 143Con. Xem phần <a href="menu-resource.html">Tài nguyên Menu</a>.</td> 144 </tr> 145 146 <tr> 147 <td><code>raw/</code></td> 148 <td><p>Tệp tùy ý để lưu trong dạng thô của chúng. Để mở những tài nguyên có một 149{@link java.io.InputStream} thô này, hãy gọi {@link android.content.res.Resources#openRawResource(int) 150Resources.openRawResource()} bằng ID tài nguyên, chính là {@code R.raw.<em>filename</em>}.</p> 151 <p>Tuy nhiên, nếu cần truy cập tên tệp gốc và phân cấp tệp, bạn có thể xem xét 152lưu một số tài nguyên trong thư mục {@code 153assets/} (thay vì {@code res/raw/}). Các tệp trong {@code assets/} không được cấp 154ID tài nguyên, vì thế bạn chỉ có thể đọc chúng bằng cách sử dụng {@link android.content.res.AssetManager}.</p></td> 155 </tr> 156 157 <tr> 158 <td><code>values/</code></td> 159 <td><p>Tệp XML chứa các giá trị đơn giản, chẳng hạn như xâu, số nguyên, và màu sắc.</p> 160 <p>Trong đó, tệp tài nguyên XML trong các thư mục con {@code res/} khác định nghĩa một tài nguyên đơn lẻ 161dựa trên tên tệp XML, tệp trong thư mục {@code values/} sẽ mô tả nhiều nguồn. 162Đối với tệp trong thư mục này, mỗi phần tử con của phần tử {@code <resources>} lại định nghĩa một tài nguyên 163duy nhất. Ví dụ, phần tử {@code <string>} tạo tài nguyên 164{@code R.string} và phần tử {@code <color>} tạo tài nguyên {@code R.color} 165.</p> 166 <p>Vì mỗi tài nguyên được định nghĩa bằng phần tử XML của chính nó, bạn có thể đặt tên tệp 167theo cách mình muốn và đặt các loại tài nguyên khác nhau vào một tệp. Tuy nhiên, để giải thích rõ, bạn có thể 168muốn đặt các loại tài nguyên duy nhất vào những tệp khác nhau. Ví dụ, sau đây là một số quy ước 169tên tệp cho các tài nguyên mà bạn có thể tạo trong thư mục này:</p> 170 <ul> 171 <li>arrays.xml cho mảng tài nguyên (<a href="more-resources.html#TypedArray">mảng có phân loại</a>).</li> 172 <li>colors.xml cho <a href="more-resources.html#Color">giá trị màu</a></li> 173 <li>dimens.xml cho <a href="more-resources.html#Dimension">giá trị kích thước</a>.</li> 174 <li>strings.xml cho <a href="string-resource.html">giá trị 175xâu</a>.</li> 176 <li>styles.xml cho <a href="style-resource.html">kiểu</a>.</li> 177 </ul> 178 <p>Xem các phần <a href="string-resource.html">Tài nguyên Xâu</a>, 179 <a href="style-resource.html">Tài nguyên Kiểu</a>, và 180 <a href="more-resources.html">các Loại Tài nguyên khác</a>.</p> 181 </td> 182 </tr> 183 184 <tr> 185 <td><code>xml/</code></td> 186 <td>Tệp XML tùy ý mà có thể được đọc vào thời gian chạy bằng cách gọi {@link 187android.content.res.Resources#getXml(int) Resources.getXML()}. Các tệp cấu hình XML khác nhau 188phải được lưu ở đây, chẳng hạn như một <a href="{@docRoot}guide/topics/search/searchable-config.html">cấu hình có thể tìm kiếm</a>. 189<!-- or preferences configuration. --></td> 190 </tr> 191</table> 192 193<p class="caution"><strong>Chú ý:</strong> Không được lưu tệp tài nguyên trực tiếp vào trong thư mục 194{@code res/}—nó sẽ gây ra lỗi với trình biên dịch.</p> 195 196<p>Để biết thêm thông tin về các loại tài nguyên, hãy xem tài liệu <a href="available-resources.html">Các Loại Tài nguyên</a>.</p> 197 198<p>Tài nguyên mà bạn lưu trong thư mục con được định nghĩa trong bảng 1 là những tài nguyên "mặc định" 199của bạn. Cụ thể, những tài nguyên này định nghĩa thiết kế và nội dung mặc định cho ứng dụng của bạn. 200Tuy nhiên, các loại thiết bị dựa trên nền tảng Android khác nhau có thể gọi các loại tài nguyên khác nhau. 201Ví dụ, nếu một thiết bị có một màn hình lớn hơn bình thường, khi đó bạn nên cung cấp 202các tài nguyên bố trí khác nhau để tận dụng diện tích màn hình tăng thêm. Hoặc, nếu một thiết bị có 203thiết đặt ngôn ngữ khác, khi đó bạn nên cung cấp các tài nguyên xâu khác để biên dịch 204văn bản trong giao diện người dùng của mình. Để cung cấp những tài nguyên khác nhau này cho các cấu hình 205thiết bị khác nhau, bạn cần cung cấp tài nguyên thay thế bên cạnh những tài nguyên 206mặc định của mình.</p> 207 208 209<h2 id="AlternativeResources">Cung cấp Tài nguyên Thay thế</h2> 210 211 212<div class="figure" style="width:429px"> 213<img src="{@docRoot}images/resources/resource_devices_diagram2.png" height="167" alt="" /> 214<p class="img-caption"> 215<strong>Hình 1.</strong> Hai thiết bị khác nhau, mỗi thiết bị sử dụng các tài nguyên bố trí khác nhau.</p> 216</div> 217 218<p>Hầu như mọi ứng dụng đều nên cung cấp các tài nguyên thay thế để hỗ trợ những cấu hình 219thiết bị cụ thể. Ví dụ, bạn nên bao gồm các tài nguyên vẽ được thay thế cho các mật độ 220màn hình khác nhau và tài nguyên xâu thay thế cho các ngôn ngữ khác nhau. Vào thời gian chạy, Android 221sẽ phát hiện cấu hình thiết bị hiện tại và tải các tài nguyên 222tương ứng cho ứng dụng của bạn.</p> 223 224<p>Để quy định các phương án thay thế theo cấu hình cụ thể cho một tập hợp tài nguyên:</p> 225<ol> 226 <li>Tạo một thư mục mới trong {@code res/} có tên theo dạng {@code 227<em><resources_name></em>-<em><config_qualifier></em>}. 228 <ul> 229 <li><em>{@code <resources_name>}</em> là tên thư mục của các tài nguyên mặc định tương ứng 230(được định nghĩa trong bảng 1).</li> 231 <li><em>{@code <qualifier>}</em> là tên quy định một cấu hình riêng 232mà những tài nguyên này sẽ được sử dụng cho nó (được định nghĩa trong bảng 2).</li> 233 </ul> 234 <p>Bạn có thể nối nhiều hơn một <em>{@code <qualifier>}</em>. Tách riêng từng cái 235bằng một nét gạch.</p> 236 <p class="caution"><strong>Chú ý:</strong> Khi nối nhiều hạn định, bạn phải 237đặt chúng theo cùng thứ tự liệt kê trong bảng 2. Nếu các hạn định được xếp thứ tự 238sai, tài nguyên sẽ bị bỏ qua.</p> 239 </li> 240 <li>Lưu các tài nguyên thay thế tương ứng vào thư mục mới này. Tệp tài nguyên phải được 241đặt tên đúng như các tệp tài nguyên mặc định.</li> 242</ol> 243 244<p>Ví dụ, sau đây là một số tài nguyên mặc định và thay thế:</p> 245 246<pre class="classic no-pretty-print"> 247res/ 248 drawable/ <span style="color:black"> 249 icon.png 250 background.png </span> 251 drawable-hdpi/ <span style="color:black"> 252 icon.png 253 background.png </span> 254</pre> 255 256<p>Hạn định {@code hdpi} cho biết rằng các tài nguyên trong thư mục đó áp dụng cho những thiết bị có 257màn hình mật độ cao. Hình ảnh trong từng thư mục vẽ được này được định cỡ cho một mật độ 258màn hình cụ thể, nhưng tên tệp thì 259giống hệt. Bằng cách này, ID tài nguyên mà bạn sử dụng để tham chiếu {@code icon.png} hoặc hình ảnh {@code 260background.png} luôn như nhau, nhưng Android sẽ chọn 261phiên bản của từng tài nguyên cho khớp tốt nhất với thiết bị hiện tại, bằng cách so sánh thông tin cấu hình thiết bị 262với các hạn định về tên thư mục tài nguyên.</p> 263 264<p>Android hỗ trợ một vài hạn định cấu hình và bạn có thể 265thêm nhiều hạn định vào một tên thư mục, bằng cách tách riêng từng hạn định bằng một nét gạch. Bảng 2 266liệt kê các hạn định cấu hình hợp lệ, theo thứ tự ưu tiên—nếu bạn sử dụng nhiều 267hạn định cho một thư mục tài nguyên, bạn phải thêm chúng vào tên thư mục theo thứ tự được liệt kê trong 268bảng.</p> 269 270 271<p class="table-caption" id="table2"><strong>Bảng 2.</strong> Tên của hạn định 272cấu hình.</p> 273<table> 274 <tr> 275 <th>Cấu hình</th> 276 <th>Giá trị Hạn định</th> 277 <th>Mô tả</th> 278 </tr> 279 <tr id="MccQualifier"> 280 <td>MCC và MNC</td> 281 <td>Ví dụ:<br/> 282 <code>mcc310</code><br/> 283 <code><nobr>mcc310-mnc004</nobr></code><br/> 284 <code>mcc208-mnc00</code><br/> 285 v.v. 286 </td> 287 <td> 288 <p>Mã quốc gia di động (MCC), đằng sau có thể là mã mạng di động (MNC) 289 từ thẻ SIM trong thiết bị. Ví dụ, <code>mcc310</code> ở Hoa Kỳ đối với mọi nhà mạng, 290 <code>mcc310-mnc004</code> ở Hoa Kỳ đối với Verizon, và <code>mcc208-mnc00</code> ở Pháp đối với 291 Orange.</p> 292 <p>Nếu thiết bị sử dụng một kết nối vô tuyến (điện thoại GSM), các giá trị MCC và MNC sẽ lấy 293 từ thẻ SIM.</p> 294 <p>Bạn cũng có thể sử dụng chỉ MCC (ví dụ, để đưa các tài nguyên 295pháp lý theo quốc gia cụ thể vào ứng dụng của bạn). Nếu bạn cần quy định chỉ dựa trên ngôn ngữ, hãy sử dụng hạn định 296<em>ngôn ngữ và khu vực</em> để thay thế (được trình bày ở phần tiếp theo). Nếu bạn quyết định sử dụng hạn định MCC và 297MNC, bạn nên cẩn thận và kiểm tra xem nó có hoạt động như kỳ vọng không.</p> 298 <p>Ngoài ra, cũng xem các trường cấu hình {@link 299android.content.res.Configuration#mcc}, và {@link 300android.content.res.Configuration#mnc}, tương ứng cho biết mã quốc gia di động và 301mã mạng di động hiện tại.</p> 302 </td> 303 </tr> 304 <tr id="LocaleQualifier"> 305 <td>Ngôn ngữ và khu vực</td> 306 <td>Ví dụ:<br/> 307 <code>en</code><br/> 308 <code>fr</code><br/> 309 <code>en-rUS</code><br/> 310 <code>fr-rFR</code><br/> 311 <code>fr-rCA</code><br/> 312 v.v. 313 </td> 314 <td><p>Ngôn ngữ được định nghĩa bằng một mã ngôn ngữ <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">ISO 315 639-1</a> gồm hai chữ cái, có thể theo sau là một mã khu vực 316 <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html">ISO 317 3166-1-alpha-2</a> dài hai chữ cái (đằng trước là "{@code r}" chữ thường). 318 </p><p> 319 Các mã <em>không</em> phân biệt chữ hoa/thường; tiền tố {@code r} được sử dụng để 320 phân biệt phần khu vực. 321 Bạn không thể chỉ quy định một khu vực.</p> 322 <p>Điều này có thể thay đổi trong suốt vòng đời 323ứng dụng của bạn nếu người dùng thay đổi ngôn ngữ của mình trong cài đặt hệ thống. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để biết thông tin về 324ảnh hưởng có thể có của thay đổi này tới ứng dụng của bạn trong thời gian chạy.</p> 325 <p>Xem phần <a href="localization.html">Bản địa hóa</a> để biết hướng dẫn đầy đủ về việc bản địa hóa 326ứng dụng của bạn cho các ngôn ngữ khác.</p> 327 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#locale}, trong đó 328cho biết địa phương hiện tại.</p> 329 </td> 330 </tr> 331 <tr id="LayoutDirectionQualifier"> 332 <td>Chỉ hướng Bố trí</td> 333 <td><code>ldrtl</code><br/> 334 <code>ldltr</code><br/> 335 </td> 336 <td><p>Chỉ hướng bố trí của ứng dụng của bạn. {@code ldrtl} có nghĩa là "chỉ-hướng-bố-trí-phải-qua-trái". 337 {@code ldltr} có nghĩa là "chỉ-hướng-bố-trí-trái-qua-phải" và là giá trị không biểu thị mặc định. 338 </p> 339 <p>Điều này có thể áp dụng cho bất kỳ tài nguyên nào, chẳng hạn như bố trí, nội dung vẽ được hoặc giá trị. 340 </p> 341 <p>Ví dụ, nếu bạn muốn cung cấp một bố trí cụ thể cho ngôn ngữ Ả-rập và một 342 bố trí chung nào đó cho bất kỳ ngôn ngữ “phải-qua-trái" nào khác (như chữ Ba Tư hoặc Do Thái), vậy bạn sẽ phải: 343 </p> 344<pre class="classic no-pretty-print"> 345res/ 346 layout/ <span style="color:black"> 347 main.xml </span>(Default layout) 348 layout-ar/ <span style="color:black"> 349 main.xml </span>(Specific layout for Arabic) 350 layout-ldrtl/ <span style="color:black"> 351 main.xml </span>(Any "right-to-left" language, except 352 for Arabic, because the "ar" language qualifier 353 has a higher precedence.) 354</pre> 355 <p class="note"><strong>Lưu ý:</strong> Để kích hoạt các tính năng bố trí phải-qua-trái 356 cho ứng dụng của mình, bạn phải đặt <a href="{@docRoot}guide/topics/manifest/application-element.html#supportsrtl">{@code 357 supportsRtl}</a> thành {@code "true"} và đặt <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> thành 17 trở lên.</p> 358 <p><em>Được thêm trong API mức 17.</em></p> 359 </td> 360 </tr> 361 <tr id="SmallestScreenWidthQualifier"> 362 <td>smallestWidth</td> 363 <td><code>sw<N>dp</code><br/><br/> 364 Ví dụ:<br/> 365 <code>sw320dp</code><br/> 366 <code>sw600dp</code><br/> 367 <code>sw720dp</code><br/> 368 v.v. 369 </td> 370 <td> 371 <p>Kích cỡ cơ bản của một màn hình, thể hiện bằng kích thước ngắn nhất của khu vực màn hình 372khả dụng. Cụ thể, smallestWidth của thiết bị bằng khoảng ngắn nhất giữa chiều cao và chiều rộng 373khả dụng của màn hình (bạn cũng có thể gọi là "chiều rộng nhỏ nhất có thể" cho màn hình). Bạn có thể 374sử dụng hạn định này để đảm bảo rằng, không phụ thuộc vào hướng hiện tại của màn hình, ứng dụng 375của bạn có ít nhất {@code <N>} dp chiều rộng khả dụng cho UI của mình.</p> 376 <p>Ví dụ, nếu bố trí của bạn yêu cầu rằng kích thước nhỏ nhất của khu vực màn hình tối thiểu 377phải luôn bằng 600 dp, vậy bạn có thể sử dụng hạn định này để tạo các tài nguyên bố trí, {@code 378res/layout-sw600dp/}. Hệ thống sẽ chỉ sử dụng những tài nguyên này khi kích thước nhỏ nhất của 379màn hình khả dụng tối thiểu bằng 600dp, không phụ thuộc vào cạnh 600dp là chiều cao hay chiều rộng 380theo nhận thức của người dùng. SmallestWidth là đặc trưng kích cỡ màn hình cố định của thiết bị; <strong>smallestWidth của 381thiết bị không thay đổi khi hướng của màn hình thay đổi</strong>.</p> 382 <p>SmallestWidth của một thiết bị sẽ xem xét cả trang trí màn hình và UI hệ thống. Ví 383dụ, nếu thiết bị có một số phần tử UI cố định trên màn hình mà chiếm mất khoảng trống dọc 384theo trục smallestWidth, hệ thống sẽ khai báo smallestWidth nhỏ hơn kích cỡ màn hình 385thực tế, bởi chúng là những điểm ảnh màn hình không khả dụng cho UI của bạn. Vì thế, giá trị mà bạn sử dụng 386nên là kích thước nhỏ nhất thực tế <em>mà bố trí của bạn yêu cầu</em> (thông thường, giá trị này bằng 387"chiều rộng nhỏ nhất" mà bố trí của bạn hỗ trợ, không phụ thuộc vào hướng hiện tại của màn hình).</p> 388 <p>Một số giá trị mà bạn có thể sử dụng ở đây đối với các kích cỡ màn hình phổ biến:</p> 389 <ul> 390 <li>320, cho các thiết bị có cấu hình màn hình như: 391 <ul> 392 <li>240x320 ldpi (thiết bị cầm tay QVGA)</li> 393 <li>320x480 mdpi (thiết bị cầm tay)</li> 394 <li>480x800 hdpi (thiết bị cầm tay mật độ cao)</li> 395 </ul> 396 </li> 397 <li>480, đối với những màn hình như 480x800 mdpi (máy tính bảng/thiết bị cầm tay).</li> 398 <li>600, đối với những màn hình như 600x1024 mdpi (máy tính bảng 7").</li> 399 <li>720, đối với những màn hình như 720x1280 mdpi (máy tính bảng 10").</li> 400 </ul> 401 <p>Khi ứng dụng của bạn cung cấp nhiều thư mục tài nguyên với những giá trị khác nhau cho 402 hạn định smallestWidth, hệ thống sẽ sử dụng hạn định gần nhất với (không vượt quá) 403smallestWidth của thiết bị. </p> 404 <p><em>Được thêm trong API mức 13.</em></p> 405 <p>Xem thêm thuộc tính <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html#requiresSmallest">{@code 406android:requiresSmallestWidthDp}</a>, trong đó khai báo smallestWidth tối thiểu mà ứng dụng của bạn 407tương thích với, và trường cấu hình {@link 408android.content.res.Configuration#smallestScreenWidthDp}, trong đó lưu trữ giá trị 409smallestWidth của thiết bị.</p> 410 <p>Để biết thêm thông tin về việc thiết kế cho các màn hình khác nhau và sử dụng hạn định 411này, hãy xem hướng dẫn dành cho nhà phát triển <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ 412Nhiều Màn hình</a>.</p> 413 </td> 414 </tr> 415 <tr id="ScreenWidthQualifier"> 416 <td>Chiều rộng khả dụng</td> 417 <td><code>w<N>dp</code><br/><br/> 418 Ví dụ:<br/> 419 <code>w720dp</code><br/> 420 <code>w1024dp</code><br/> 421 v.v. 422 </td> 423 <td> 424 <p>Quy định một chiều rộng màn hình khả dụng tối thiểu theo đơn vị {@code dp} mà tại đó, tài nguyên 425 nên được sử dụng—được định nghĩa bởi giá trị <code><N></code>. Giá trị 426 cấu hình này sẽ thay đổi khi hướng 427 thay đổi giữa khổ ngang và dọc để khớp với chiều rộng thực tế hiện tại.</p> 428 <p>Khi ứng dụng của bạn cung cấp nhiều thư mục tài nguyên với những giá trị khác nhau 429 cho cấu hình này, hệ thống sẽ sử dụng giá trị gần nhất với (không vượt quá) 430 chiều rộng hiện tại của màn hình. Giá trị 431 ở đây xét cả trang trí trên màn hình, vì thế nếu thiết bị có một số 432 phần tử UI cố định ở cạnh trái hoặc phải của màn hình, nó 433 sẽ sử dụng một giá trị cho chiều rộng nhỏ hơn kích cỡ màn hình thực sự, dùng 434 cho những phần tử UI này và làm giảm khoảng trống khả dụng của ứng dụng.</p> 435 <p><em>Được thêm trong API mức 13.</em></p> 436 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#screenWidthDp} 437 mà chứa chiều rộng màn hình hiện tại.</p> 438 <p>Để biết thêm thông tin về việc thiết kế cho các màn hình khác nhau và sử dụng hạn định 439này, hãy xem hướng dẫn dành cho nhà phát triển <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ 440Nhiều Màn hình</a>.</p> 441 </td> 442 </tr> 443 <tr id="ScreenHeightQualifier"> 444 <td>Chiều cao khả dụng</td> 445 <td><code>h<N>dp</code><br/><br/> 446 Ví dụ:<br/> 447 <code>h720dp</code><br/> 448 <code>h1024dp</code><br/> 449 v.v. 450 </td> 451 <td> 452 <p>Quy định chiều cao màn hình khả dụng tối thiểu theo đơn vị "dp" mà tại đó tài nguyên 453 nên được sử dụng—được định nghĩa bởi giá trị <code><N></code>. Giá trị 454 cấu hình này sẽ thay đổi khi hướng 455 thay đổi giữa khổ ngang và dọc để khớp với chiều cao thực tế hiện tại.</p> 456 <p>Khi ứng dụng của bạn cung cấp nhiều thư mục tài nguyên với những giá trị khác nhau 457 cho cấu hình này, hệ thống sẽ sử dụng giá trị gần nhất với (không vượt quá) 458 chiều cao hiện tại của màn hình. Giá trị 459 ở đây xét cả trang trí trên màn hình, vì thế nếu thiết bị có một số 460 phần tử UI cố định trên cạnh trên hoặc dưới của màn hình, nó sẽ sử dụng 461 một giá trị cho chiều cao nhỏ hơn kích cỡ màn hình thực sự, dùng 462 cho những phần tử UI này và làm giảm khoảng trống khả dụng của ứng dụng. Trang trí 463 trên màn hình mà không cố định (chẳng hạn như thanh trạng thái của điện thoại mà có thể được 464 ẩn khi ở toàn màn hình) <em>không</em> được xét ở đây, cả 465 những trang trí trên cửa sổ như thanh tiêu đề hay thanh hành động cũng vậy, vì thế ứng dụng phải được chuẩn bị để 466 xử lý một khoảng trống nhỏ hơn mức mà chúng quy định. 467 <p><em>Được thêm trong API mức 13.</em></p> 468 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#screenHeightDp} 469 mà chứa chiều rộng màn hình hiện tại.</p> 470 <p>Để biết thêm thông tin về việc thiết kế cho các màn hình khác nhau và sử dụng hạn định 471này, hãy xem hướng dẫn dành cho nhà phát triển <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ 472Nhiều Màn hình</a>.</p> 473 </td> 474 </tr> 475 <tr id="ScreenSizeQualifier"> 476 <td>Kích cỡ màn hình</td> 477 <td> 478 <code>small</code><br/> 479 <code>normal</code><br/> 480 <code>large</code><br/> 481 <code>xlarge</code> 482 </td> 483 <td> 484 <ul class="nolist"> 485 <li>{@code small}: Các màn hình có kích cỡ tương tự như màn hình 486 QVGA mật độ thấp. Kích cỡ bố trí tối thiểu đối với một màn hình nhỏ 487 bằng xấp xỉ 320x426 đơn vị dp. Các ví dụ như QVGA mật độ thấp và VGA mật độ 488 cao.</li> 489 <li>{@code normal}: Các màn hình có kích cỡ tương tự như màn hình 490 HVGA mật độ trung bình. Kích cỡ bố trí tối thiểu 491 đối với một màn hình bình thường bằng xấp xỉ 320x470 đơn vị dp. Ví dụ 492 về những màn hình như vậy là WQVGA mật độ thấp, HVGA mật độ trung bình, WVGA 493 mật độ cao.</li> 494 <li>{@code large}: Các màn hình có kích cỡ tương tự như màn hình 495 VGA mật độ trung bình. 496 Kích cỡ bố trí tối thiểu đối với một màn hình lớn bằng xấp xỉ 480x640 đơn vị dp. 497 Ví dụ như các màn hình mật độ trung bình VGA và WVGA.</li> 498 <li>{@code xlarge}: Các màn hình lớn hơn đáng kể so với màn hình 499 HVGA mật độ trung bình truyền thống. Kích cỡ bố trí tối thiểu đối với một màn hình siêu lớn 500 bằng xấp xỉ 720x960 đơn vị dp. Trong hầu hết trường hợp, những thiết bị có màn hình 501 siêu lớn sẽ quá lớn để mang trong túi và gần như là 502 thiết bị kiểu máy tính bảng. <em>Được thêm trong API mức 9.</em></li> 503 </ul> 504 <p class="note"><strong>Lưu ý:</strong> Việc sử dụng một hạn định kích cỡ không hàm ý rằng các 505tài nguyên <em>chỉ</em> áp dụng cho màn hình có kích cỡ đó. Nếu bạn không cung cấp cho các tài nguyên 506thay thế với các hạn định khớp tốt hơn với cấu hình thiết bị hiện tại, hệ thống có thể sử dụng 507bất kỳ tài nguyên nào <a href="#BestMatch">phù hợp nhất</a>.</p> 508 <p class="caution"><strong>Chú ý:</strong> Nếu tất cả tài nguyên của bạn sử dụng một hạn định kích cỡ 509<em>lớn hơn</em> màn hình hiện tại, hệ thống sẽ <strong>không</strong> sử dụng chúng và 510ứng dụng của bạn sẽ bị lỗi vào thời gian chạy (ví dụ, nếu tất cả tài nguyên bố trí được gắn thẻ hạn định {@code 511xlarge} nhưng thiết bị lại có màn hình kích cỡ bình thường).</p> 512 <p><em>Được thêm trong API mức 4.</em></p> 513 514 <p>Xem <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ Nhiều 515Màn hình</a> để biết thêm thông tin.</p> 516 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#screenLayout}, 517ở đó cho biết màn hình là màn hình nhỏ, bình thường, 518hay lớn.</p> 519 </td> 520 </tr> 521 <tr id="ScreenAspectQualifier"> 522 <td>Tỷ lệ màn hình</td> 523 <td> 524 <code>long</code><br/> 525 <code>notlong</code> 526 </td> 527 <td> 528 <ul class="nolist"> 529 <li>{@code long}: Màn hình dài, chẳng hạn như WQVGA, WVGA, FWVGA</li> 530 <li>{@code notlong}: Màn hình không dài, chẳng hạn như QVGA, HVGA và VGA</li> 531 </ul> 532 <p><em>Được thêm trong API mức 4.</em></p> 533 <p>Giá trị này thuần túy được dựa trên tỷ lệ khung ảnh của màn hình (màn hình "dài" sẽ rộng hơn). Nó 534không liên quan tới hướng của màn hình.</p> 535 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#screenLayout}, 536ở đó cho biết màn hình có dài không.</p> 537 </td> 538 </tr> 539 <tr id="OrientationQualifier"> 540 <td>Hướng của màn hình</td> 541 <td> 542 <code>port</code><br/> 543 <code>land</code> <!-- <br/> 544 <code>square</code> --> 545 </td> 546 <td> 547 <ul class="nolist"> 548 <li>{@code port}: Thiết bị ở hướng đứng (thẳng đứng)</li> 549 <li>{@code land}: Thiết bị ở khổ ngang (nằm ngang)</li> 550 <!-- Square mode is currently not used. --> 551 </ul> 552 <p>Giá trị này có thể thay đổi trong suốt vòng đời ứng dụng của bạn nếu người dùng xoay 553màn hình. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để biết thông tin về 554ảnh hưởng của điều này tới ứng dụng của bạn trong thời gian chạy.</p> 555 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#orientation}, trong đó 556cho biết hướng thiết bị hiện tại.</p> 557 </td> 558 </tr> 559 <tr id="UiModeQualifier"> 560 <td>Chế độ UI</td> 561 <td> 562 <code>car</code><br/> 563 <code>desk</code><br/> 564 <code>television</code><br/> 565 <code>appliance</code> 566 <code>watch</code> 567 </td> 568 <td> 569 <ul class="nolist"> 570 <li>{@code car}: Thiết bị đang hiển thị trong đế gắn trên ô-tô</li> 571 <li>{@code desk}: Thiết bị đang hiển thị trong đế gắn trên bàn</li> 572 <li>{@code television}: Thiết bị đang hiển thị trên một TV, mang đến một 573 trải nghiệm "10 foot" (3 mét) trong đó UI của nó nằm trên một màn hình lớn 574 cách xa người dùng, được định hướng chủ yếu quanh DPAD hoặc cách 575 tương tác không sử dụng con trỏ khác</li> 576 <li>{@code appliance}: Thiết bị đang đóng vai trò như một dụng cụ không 577 có màn hình hiển thị</li> 578 <li>{@code watch}: Thiết bị có một màn hình hiển thị và được đeo trên cổ tay</li> 579 </ul> 580 <p><em>Được thêm trong API mức 8, TV được thêm trong API 13, đồng hồ được thêm trong API 20.</em></p> 581 <p>Để biết thông tin về cách ứng dụng của bạn hồi đáp khi thiết bị được cắm vào hoặc 582 rút khỏi đế, hãy đọc <a href="{@docRoot}training/monitoring-device-state/docking-monitoring.html">Xác định 583và Theo dõi Trạng thái và Loại Đế</a>.</p> 584 <p>Giá trị này có thể thay đổi trong suốt vòng đời ứng dụng của bạn nếu người dùng đặt 585thiết bị vào đế. Bạn có thể kích hoạt hoặc vô hiệu hóa một số chế độ này bằng cách sử dụng {@link 586android.app.UiModeManager}. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để 587biết thông tin về ảnh hưởng của điều này tới ứng dụng của bạn trong thời gian chạy.</p> 588 </td> 589 </tr> 590 <tr id="NightQualifier"> 591 <td>Chế độ ban đêm</td> 592 <td> 593 <code>night</code><br/> 594 <code>notnight</code> 595 </td> 596 <td> 597 <ul class="nolist"> 598 <li>{@code night}: Thời gian ban đêm</li> 599 <li>{@code notnight}: Thời gian ban ngày</li> 600 </ul> 601 <p><em>Được thêm trong API mức 8.</em></p> 602 <p>Giá trị này có thể thay đổi trong suốt vòng đời ứng dụng của bạn nếu chế độ ban đêm được để ở 603chế độ tự động (mặc định), trong trường hợp đó chế độ sẽ thay đổi dựa vào thời gian trong ngày. Bạn có thể kích hoạt 604hoặc vô hiệu hóa chế độ này bằng cách sử dụng {@link android.app.UiModeManager}. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để biết thông tin về ảnh hưởng của điều này tới 605ứng dụng của bạn trong thời gian chạy.</p> 606 </td> 607 </tr> 608 <tr id="DensityQualifier"> 609 <td>Mật độ điểm ảnh màn hình (dpi)</td> 610 <td> 611 <code>ldpi</code><br/> 612 <code>mdpi</code><br/> 613 <code>hdpi</code><br/> 614 <code>xhdpi</code><br/> 615 <code>xxhdpi</code><br/> 616 <code>xxxhdpi</code><br/> 617 <code>nodpi</code><br/> 618 <code>tvdpi</code> 619 </td> 620 <td> 621 <ul class="nolist"> 622 <li>{@code ldpi}: Màn hình mật độ thấp; xấp xỉ 120dpi.</li> 623 <li>{@code mdpi}: Màn hình mật độ trung bình (trên HVGA truyền thống); xấp xỉ 624160dpi.</li> 625 <li>{@code hdpi}: Màn hình mật độ cao; xấp xỉ 240dpi.</li> 626 <li>{@code xhdpi}: Màn hình mật độ siêu cao; xấp xỉ 320dpi. <em>Được thêm trong API 627Mức 8</em></li> 628 <li>{@code xxhdpi}: Màn hình mật độ siêu siêu cao; xấp xỉ 480dpi. <em>Được thêm trong API 629Mức 16</em></li> 630 <li>{@code xxxhdpi}: Mật độ siêu siêu siêu cao sử dụng (chỉ biểu tượng trình khởi chạy, xem 631 <a href="{@docRoot}guide/practices/screens_support.html#xxxhdpi-note">ghi chú</a> 632 trong <em>Hỗ trợ Nhiều Màn hình</em>); xấp xỉ 640dpi. <em>Được thêm trong API 633Mức 18</em></li> 634 <li>{@code nodpi}: Loại này có thể được sử dụng cho tài nguyên bitmap mà bạn không muốn được định cỡ 635cho khớp với mật độ của thiết bị.</li> 636 <li>{@code tvdpi}: Màn hình trong khoảng giữa mdpi và hdpi; xấp xỉ 213dpi. Đây 637không được coi là nhóm mật độ "cơ bản". Nó được dành chủ yếu cho TV và hầu hết 638các ứng dụng không cần nó—với điều kiện các tài nguyên mdpi và hpdi đủ cho hầu hết ứng dụng 639và hệ thống sẽ định cỡ chúng cho phù hợp. Hạn định này đã được giới thiệu với API mức 13.</li> 640 </ul> 641 <p>Có tỷ lệ định cỡ 3:4:6:8:12:16 giữa sáu mật độ cơ bản (bỏ qua mật độ 642tvdpi). Vì thế, một tệp bimap 9x9 trong ldpi sẽ bằng 12x12 trong mdpi, 18x18 trong hdpi, 24x24 trong xhdpi, v.v. 643</p> 644 <p>Nếu bạn quyết định rằng tài nguyên hình ảnh của mình không đủ đẹp trên TV hoặc 645một số thiết bị khác và muốn thử tài nguyên tvdpi, hệ số định cỡ sẽ bằng 1,33*mdpi. Ví 646dụ, một hình ảnh 100px x 100px đối với màn hình mdpi sẽ bằng 133px x 133px đối với tvdpi.</p> 647 <p class="note"><strong>Lưu ý:</strong> Việc sử dụng một hạn định mật độ không hàm ý rằng các 648tài nguyên <em>chỉ</em> áp dụng cho màn hình có mật độ đó. Nếu bạn không cung cấp cho các tài nguyên 649thay thế với các hạn định khớp tốt hơn với cấu hình thiết bị hiện tại, hệ thống có thể sử dụng 650bất kỳ tài nguyên nào <a href="#BestMatch">phù hợp nhất</a>.</p> 651 <p>Xem <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ Nhiều 652Màn hình</a> để biết thêm thông tin về cách xử lý các mật độ màn hình khác nhau và cách Android 653có thể định cỡ bitmap của mình cho vừa với mật độ hiện tại.</p> 654 </td> 655 </tr> 656 <tr id="TouchscreenQualifier"> 657 <td>Loại màn hình cảm ứng</td> 658 <td> 659 <code>notouch</code><br/> 660 <code>finger</code> 661 </td> 662 <td> 663 <ul class="nolist"> 664 <li>{@code notouch}: Thiết bị không có màn hình cảm ứng.</li> 665 <li>{@code finger}: Thiết bị có màn hình cảm ứng để 666 được sử dụng thông qua tương tác hướng của ngón tay của người dùng.</li> 667 </ul> 668 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#touchscreen}, 669nó cho biết loại màn hình cảm ứng trên thiết bị.</p> 670 </td> 671 </tr> 672 <tr id="KeyboardAvailQualifier"> 673 <td>Sự sẵn có của bàn phím</td> 674 <td> 675 <code>keysexposed</code><br/> 676 <code>keyshidden</code><br/> 677 <code>keyssoft</code> 678 </td> 679 <td> 680 <ul class="nolist"> 681 <li>{@code keysexposed}: Thiết bị có sẵn một bàn phím. Nếu thiết bị có một 682bàn phím mềm được kích hoạt (có khả năng), giá trị này có thể được sử dụng khi bàn phím cứng 683<em>không</em> hiển thị trước người dùng, ngay cả khi thiết bị không có bàn phím cứng. Nếu không có 684bàn phím mềm hoặc bàn phím mềm bị vô hiệu hóa, khi đó giá trị này chỉ được sử dụng khi một bàn phím cứng được 685hiển thị.</li> 686 <li>{@code keyshidden}: Thiết bị có sẵn một bàn phím cứng nhưng nó bị 687ẩn đi <em>và </em> thiết bị <em>không</em> có bàn phím mềm được kích hoạt.</li> 688 <li>{@code keyssoft}: Thiết bị có một bàn phím mềm được kích hoạt dù nó có 689hiển thị hay không.</li> 690 </ul> 691 <p>Nếu bạn cung cấp các tài nguyên <code>keysexposed</code>, nhưng không cung cấp tài nguyên <code>keyssoft</code> 692, hệ thống sẽ sử dụng tài nguyên <code>keysexposed</code> mà không phụ thuộc vào việc có hiển thị 693bàn phím hay không, miễn là hệ thống có kích hoạt một bàn phím mềm.</p> 694 <p>Giá trị này có thể thay đổi trong vòng đời ứng dụng của bạn nếu người dùng mở một bàn phím 695cứng. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để biết thông tin về 696ảnh hưởng của điều này tới ứng dụng của bạn trong thời gian chạy.</p> 697 <p>Xem thêm các trường cấu hình {@link 698android.content.res.Configuration#hardKeyboardHidden} và {@link 699android.content.res.Configuration#keyboardHidden}, theo đó tương ứng cho biết mức độ hiển thị của bàn phím 700cứng và mức độ hiển thị của bất kỳ loại bàn phím nào (bao gồm bàn phím mềm).</p> 701 </td> 702 </tr> 703 <tr id="ImeQualifier"> 704 <td>Phương pháp nhập liệu văn bản chính</td> 705 <td> 706 <code>nokeys</code><br/> 707 <code>qwerty</code><br/> 708 <code>12key</code> 709 </td> 710 <td> 711 <ul class="nolist"> 712 <li>{@code nokeys}: Thiết bị không có phím cứng cho việc nhập liệu văn bản.</li> 713 <li>{@code qwerty}: Thiết bị có một bàn phím qwerty cứng, dù nó có hiển thị với 714người dùng 715hay không.</li> 716 <li>{@code 12key}: Thiết bị có một bàn phím 12-phím cứng, dù nó có hiển thị với 717người dùng hay không.</li> 718 </ul> 719 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#keyboard}, trong đó 720cho biết phương pháp nhập liệu văn bản chính sẵn có.</p> 721 </td> 722 </tr> 723 <tr id="NavAvailQualifier"> 724 <td>Sự sẵn có của phím điều hướng</td> 725 <td> 726 <code>navexposed</code><br/> 727 <code>navhidden</code> 728 </td> 729 <td> 730 <ul class="nolist"> 731 <li>{@code navexposed}: Có sẵn phím điều hướng cho người dùng.</li> 732 <li>{@code navhidden}: Không có sẵn phím điều hướng (chẳng hạn như phía sau một nắp 733đóng).</li> 734 </ul> 735 <p>Giá trị này có thể thay đổi trong suốt vòng đời ứng dụng của bạn nếu người dùng làm hiện 736phím điều hướng. Xem phần <a href="runtime-changes.html">Xử lý Thay đổi Thời gian chạy</a> để 737biết thông tin về ảnh hưởng của điều này tới ứng dụng của bạn trong thời gian chạy.</p> 738 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#navigationHidden}, 739ở đó có cho biết các phím điều hướng có bị ẩn không.</p> 740 </td> 741 </tr> 742 <tr id="NavigationQualifier"> 743 <td>Phương pháp điều hướng không cảm ứng chính</td> 744 <td> 745 <code>nonav</code><br/> 746 <code>dpad</code><br/> 747 <code>trackball</code><br/> 748 <code>wheel</code> 749 </td> 750 <td> 751 <ul class="nolist"> 752 <li>{@code nonav}: Thiết bị không có phương tiện điều hướng ngoài cách sử dụng 753màn hình cảm ứng.</li> 754 <li>{@code dpad}: Thiết bị có bàn điều hướng (d-pad) để điều hướng.</li> 755 <li>{@code trackball}: Thiết bị có bi xoay để điều hướng.</li> 756 <li>{@code wheel}: Thiết bị có bánh xe điều hướng để điều hướng (không phổ biến).</li> 757 </ul> 758 <p>Xem thêm trường cấu hình {@link android.content.res.Configuration#navigation}, trong đó 759cho biết loại phương pháp điều hướng sẵn có.</p> 760 </td> 761 </tr> 762<!-- DEPRECATED 763 <tr> 764 <td>Screen dimensions</td> 765 <td>Examples:<br/> 766 <code>320x240</code><br/> 767 <code>640x480</code><br/> 768 etc. 769 </td> 770 <td> 771 <p>The larger dimension must be specified first. <strong>This configuration is deprecated 772and should not be used</strong>. Instead use "screen size," "wider/taller screens," and "screen 773orientation" described above.</p> 774 </td> 775 </tr> 776--> 777 <tr id="VersionQualifier"> 778 <td>Phiên bản Nền tảng (Mức API)</td> 779 <td>Ví dụ:<br/> 780 <code>v3</code><br/> 781 <code>v4</code><br/> 782 <code>v7</code><br/> 783 v.v.</td> 784 <td> 785 <p>Mức API được hỗ trợ bởi thiết bị. Ví dụ, <code>v1</code> đối với API mức 7861 (thiết bị ở phiên bản Android 1.0 hoặc cao hơn) và <code>v4</code> đối với API mức 4 (thiết bị ở phiên bản Android 7871.6 hoặc cao hơn). Xem tài liệu <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Mức API của Android</a> để biết thêm thông tin 788về những giá trị này.</p> 789 </td> 790 </tr> 791</table> 792 793 794<p class="note"><strong>Lưu ý:</strong> Một số hạn định cấu hình đã được thêm kể từ phiên bản Android 7951.0, vì thế không phải tất cả phiên bản Android đều hỗ trợ tất cả hạn định. Việc sử dụng một hạn định mới sẽ hàm ý 796thêm hạn định phiên bản nền tảng sao cho các thiết bị cũ hơn chắc chắn sẽ bỏ qua nó. Ví dụ, sử dụng 797một hạn định <code>w600dp</code> sẽ tự động bao gồm hạn định <code>v13</code>, vì 798hạn định chiều rộng khả dụng mới có trong API mức 13. Để tránh bất kỳ sự cố nào, hãy luôn đưa vào một tập hợp 799các tài nguyên mặc định (tập hợp các tài nguyên <em>không có hạn định</em>). Để biết thêm thông tin, hãy xem phần 800nói về <a href="#Compatibility">Cung cấp Tính tương thích giữa Thiết bị với Tài nguyên 801Tốt nhất</a>.</p> 802 803 804 805<h3 id="QualifierRules">Quy tắc về tên hạn định</h3> 806 807<p>Sau đây là một số quy tắc về việc sử dụng tên của hạn định cấu hình:</p> 808 809<ul> 810 <li>Bạn có thể quy định nhiều hạn định cho một tập hợp đơn lẻ các tài nguyên, được tách riêng bởi dấu gạch ngang. Ví 811dụ, <code>drawable-en-rUS-land</code> sẽ áp dụng cho các thiết bị US-English ở hướng 812khổ ngang.</li> 813 <li>Các hạn định phải theo thứ tự liệt kê trong <a href="#table2">bảng 2</a>. Ví 814dụ: 815 <ul> 816 <li>Sai: <code>drawable-hdpi-port/</code></li> 817 <li>Đúng: <code>drawable-port-hdpi/</code></li> 818 </ul> 819 </li> 820 <li>Các thư mục tài nguyên thay thế không được lồng nhau. Ví dụ, bạn không được có 821<code>res/drawable/drawable-en/</code>.</li> 822 <li>Các giá trị không phân biệt chữ hoa/thường. Trình biên dịch tài nguyên sẽ chuyển tên thư mục 823 thành chữ thường trước khi xử lý để tránh các vấn đề xảy ra trên hệ thống tệp 824 không phân biệt chữ hoa/thường. Bất kỳ việc đổi sang chữ hoa nào trong tên chỉ nhằm mục đích dễ đọc hơn.</li> 825 <li>Chỉ hỗ trợ một giá trị cho mỗi loại hạn định. Ví dụ, nếu bạn muốn sử dụng 826cùng các tệp vẽ được cho tiếng Tây Ban Nha và tiếng Pháp, bạn <em>không thể</em> đặt tên thư mục là 827<code>drawable-rES-rFR/</code>. Thay vào đó, bạn cần hai thư mục tài nguyên chẳng hạn như 828<code>drawable-rES/</code> và <code>drawable-rFR/</code>, trong đó chứa các tệp phù hợp. 829Tuy nhiên, bạn không bắt buộc thực sự phải tạo bản sao các tệp như nhau ở cả hai vị trí. Thay vào đó, bạn có thể 830tạo một bí danh tới một tài nguyên. Xem phần <a href="#AliasResources">Tạo 831tài nguyên bí danh</a> ở bên dưới.</li> 832</ul> 833 834<p>Sau khi bạn lưu tài nguyên thay thế vào các thư mục được đặt tên bằng 835những hạn định này, Android sẽ tự động áp dụng các tài nguyên trong ứng dụng của bạn dựa trên 836cấu hình thiết bị hiện tại. Cứ mỗi lần yêu cầu một tài nguyên, Android lại kiểm tra các thư mục tài nguyên 837thay thế chứa tệp tài nguyên được yêu cầu, rồi <a href="#BestMatch">tìm tài nguyên 838so khớp phù hợp nhất</a> (được trình bày ở bên dưới). Nếu không có tài nguyên thay thế khớp 839với một cấu hình thiết bị cụ thể, khi đó Android sẽ sử dụng các tài nguyên mặc định tương ứng ( 840tập hợp các tài nguyên cho một loại tài nguyên cụ thể không bao gồm hạn định 841cấu hình).</p> 842 843 844 845<h3 id="AliasResources">Tạo tài nguyên bí danh</h3> 846 847<p>Khi bạn có một tài nguyên muốn sử dụng cho nhiều hơn một cấu hình 848thiết bị (nhưng không muốn cung cấp làm tài nguyên mặc định), bạn không cần đặt 849cùng tài nguyên đó vào nhiều hơn một thư mục tài nguyên thay thế. Thay vào đó, bạn có thể (trong một số trường hợp) tạo một tài nguyên 850thay thế 851đóng vai trò như một bí danh cho tài nguyên được lưu trong thư mục tài nguyên mặc định của bạn.</p> 852 853<p class="note"><strong>Lưu ý:</strong> Không phải tất cả tài nguyên đều đưa ra cơ chế mà theo đó bạn có thể 854tạo một bí danh tới một tài nguyên khác. Cụ thể, hoạt hình, menu, tài nguyên thô và các tài nguyên 855không được quy định khác trong thư mục {@code xml/} không cung cấp tính năng này.</p> 856 857<p>Ví dụ, hãy tưởng tượng bạn có một biểu tượng ứng dụng, {@code icon.png}, và cần phiên bản duy nhất của 858nó cho các bản địa khác nhau. Tuy nhiên, hai bản địa English-Canadian và French-Canadian, cần 859sử dụng cùng phiên bản. Bạn có thể giả sử rằng mình cần sao chép cùng hình ảnh 860vào thư mục tài nguyên cho cả English-Canadian và French-Canadian, nhưng điều đó 861không đúng. Thay vào đó, bạn có thể lưu hình ảnh được sử dụng cho cả hai thành {@code icon_ca.png} (bất kỳ 862tên nào khác ngoài {@code icon.png}) và đặt 863nó vào thư mục {@code res/drawable/} mặc định. Sau đó, tạo một tệp {@code icon.xml} trong {@code 864res/drawable-en-rCA/} và {@code res/drawable-fr-rCA/} tham chiếu tới tài nguyên {@code icon_ca.png} 865bằng cách sử dụng phần tử {@code <bitmap>}. Điều này cho phép bạn lưu trữ chỉ một phiên bản của tệp 866PNG và hai tệp XML nhỏ trỏ tới nó. (Ví dụ về tệp XML được trình bày ở bên dưới.)</p> 867 868 869<h4>Nội dung vẽ được</h4> 870 871<p>Để tạo một bí danh cho một nội dung vẽ được đang tồn tại, hãy sử dụng phần tử {@code <bitmap>}. 872Ví dụ:</p> 873 874<pre> 875<?xml version="1.0" encoding="utf-8"?> 876<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 877 android:src="@drawable/icon_ca" /> 878</pre> 879 880<p>Nếu bạn lưu tệp này thành {@code icon.xml} (trong một thư mục tài nguyên thay thế chẳng hạn như 881{@code res/drawable-en-rCA/}), nó sẽ được biên dịch vào một tài nguyên mà bạn 882có thể tham chiếu như là {@code R.drawable.icon}, nhưng thực tế lại là bí danh cho tài nguyên {@code 883R.drawable.icon_ca} (được lưu trong {@code res/drawable/}).</p> 884 885 886<h4>Bố trí</h4> 887 888<p>Để tạo một bí danh cho một bố trí hiện tại, hãy sử dụng phần tử {@code <include>} 889, được bọc trong một {@code <merge>}. Ví dụ:</p> 890 891<pre> 892<?xml version="1.0" encoding="utf-8"?> 893<merge> 894 <include layout="@layout/main_ltr"/> 895</merge> 896</pre> 897 898<p>Nếu bạn lưu tệp này thành {@code main.xml}, nó sẽ được biên dịch thành một tài nguyên mà bạn có thể tham chiếu 899như là {@code R.layout.main}, nhưng thực tế lại là một bí danh cho tài nguyên {@code R.layout.main_ltr} 900.</p> 901 902 903<h4>Xâu và các giá trị đơn giản khác</h4> 904 905<p>Để tạo một bí danh cho một xâu hiện có, chỉ cần sử dụng ID tài nguyên của xâu 906mong muốn làm giá trị cho xâu mới. Ví dụ:</p> 907 908<pre> 909<?xml version="1.0" encoding="utf-8"?> 910<resources> 911 <string name="hello">Hello</string> 912 <string name="hi">@string/hello</string> 913</resources> 914</pre> 915 916<p>Tài nguyên {@code R.string.hi} lúc này là một bí danh cho {@code R.string.hello}.</p> 917 918<p> <a href="{@docRoot}guide/topics/resources/more-resources.html">Các giá trị đơn giản khác</a> cũng 919hoạt động tương tự. Ví dụ, màu sắc:</p> 920 921<pre> 922<?xml version="1.0" encoding="utf-8"?> 923<resources> 924 <color name="yellow">#f00</color> 925 <color name="highlight">@color/red</color> 926</resources> 927</pre> 928 929 930 931 932<h2 id="Compatibility">Cung cấp Tính tương thích giữa Thiết bị với Tài nguyên Tốt nhất</h2> 933 934<p>Để ứng dụng của bạn hỗ trợ nhiều cấu hình thiết bị, một điều rất quan trọng đó là 935bạn luôn cung cấp các tài nguyên mặc định cho từng loại tài nguyên mà ứng dụng của bạn sử dụng.</p> 936 937<p>Ví dụ, nếu ứng dụng của bạn hỗ trợ vài ngôn ngữ, hãy luôn bao gồm một thư mục {@code 938values/} (trong đó, xâu của bạn được lưu) <em>mà không cần</em> một <a href="#LocaleQualifier">hạn định ngôn ngữ và khu vực</a>. Nếu thay vào đó bạn đặt tất cả tệp xâu của mình 939vào các thư mục có một hạn định ngôn ngữ và khu vực, khi đó ứng dụng của bạn sẽ bị lỗi khi chạy 940trên một thiết bị được đặt ở một ngôn ngữ mà các xâu của bạn không hỗ trợ. Nhưng miễn là bạn cung cấp các tài nguyên 941{@code values/} mặc định, khi đó ứng dụng của bạn sẽ chạy bình thường (ngay cả khi người dùng không 942hiểu ngôn ngữ đó—vậy còn tốt hơn là bị lỗi).</p> 943 944<p>Tương tự, nếu bạn cung cấp các tài nguyên bố trí khác nhau dựa trên hướng của màn hình, bạn nên 945chọn một hướng làm mặc định của mình. Ví dụ, thay vì cung cấp tài nguyên bố trí trong {@code 946layout-land/} cho khổ ngang và {@code layout-port/} cho khổ dọc, hãy để một cái làm mặc định, chẳng hạn như 947{@code layout/} đối với khổ ngang và {@code layout-port/} đối với khổ dọc.</p> 948 949<p>Việc cung cấp tài nguyên mặc định quan trọng không chỉ bởi ứng dụng của bạn có thể chạy trên một 950cấu hình mà bạn chưa nghĩ đến, mà còn bởi các phiên bản Android mới đôi khi thêm 951hạn định cấu hình mà những phiên bản cũ hơn không hỗ trợ. Nếu bạn sử dụng một hạn định tài nguyên mới, 952nhưng vẫn duy trì tính tương thích về mã với các phiên bản cũ hơn của Android thì khi một phiên bản cũ hơn của 953Android chạy trên ứng dụng của bạn, nó sẽ bị lỗi nếu bạn không cung cấp tài nguyên mặc định, do nó 954không thể sử dụng tài nguyên được đặt tên bằng hạn định mới. Ví dụ, nếu <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code 955minSdkVersion}</a> của bạn được đặt bằng 4, và bạn xác định tất cả tài nguyên vẽ được của mình bằng cách sử dụng <a href="#NightQualifier">chế độ ban đêm</a> ({@code night} hoặc {@code notnight}, đã được thêm trong API 956Mức 8), khi đó một thiết bị API mức 4 sẽ không thể truy cập tài nguyên vẽ được của bạn và sẽ bị lỗi. Trong trường hợp 957này, bạn có thể muốn {@code notnight} làm tài nguyên mặc định của mình, vì thế bạn nên loại trừ hạn định 958đó sao cho tài nguyên vẽ được của bạn ở trong {@code drawable/} hoặc {@code drawable-night/}.</p> 959 960<p>Vì vậy, để mang lại khả năng tương thích với thiết bị tốt nhất, hãy luôn cung cấp tài nguyên 961mặc định cho những tài nguyên mà ứng dụng của bạn cần thực hiện đúng cách. Sau đó, hãy tạo tài nguyên 962thay thế cho các cấu hình thiết bị cụ thể bằng cách sử dụng hạn định cấu hình.</p> 963 964<p>Có một ngoại lệ đối với quy tắc này: Nếu <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> của ứng dụng của bạn bằng 4 hoặc 965lớn hơn, bạn <em>không</em> cần đến tài nguyên vẽ được mặc định khi cung cấp tài nguyên 966vẽ được thay thế bằng hạn định <a href="#DensityQualifier">mật độ màn hình</a>. Kể cả khi không có 967tài nguyên vẽ được mặc định, Android cũng có thể tìm thấy kết quả khớp tốt nhất trong số các mật độ màn hình thay thế và sẽ định cỡ 968bitmap nếu cần. Tuy nhiên, để có trải nghiệm tốt nhất trên tất cả thiết bị, bạn nên 969cung cấp nội dung vẽ được thay thế cho cả ba loại mật độ.</p> 970 971 972 973<h2 id="BestMatch">Cách Android tìm Tài nguyên Khớp Tốt nhất</h2> 974 975<p>Khi bạn yêu cầu một tài nguyên mà bạn cung cấp nội dung thay thế cho nó, Android sẽ lựa chọn 976tài nguyên thay thế để sử dụng vào thời gian chạy, tùy vào cấu hình thiết bị hiện tại. Để 977diễn tả cách Android lựa chọn một tài nguyên thay thế, giả sử có các thư mục vẽ được sau, 978mỗi thư mục lại chứa các phiên bản khác nhau của cùng hình ảnh:</p> 979 980<pre class="classic no-pretty-print"> 981drawable/ 982drawable-en/ 983drawable-fr-rCA/ 984drawable-en-port/ 985drawable-en-notouch-12key/ 986drawable-port-ldpi/ 987drawable-port-notouch-12key/ 988</pre> 989 990<p>Và giả sử cấu hình thiết bị như sau:</p> 991 992<p style="margin-left:1em;"> 993Bản địa = <code>en-GB</code> <br/> 994Hướng màn hình = <code>port</code> <br/> 995Mật độ điểm ảnh màn hình = <code>hdpi</code> <br/> 996Loại màn hình cảm ứng = <code>notouch</code> <br/> 997Phương pháp nhập liệu văn bản chính = <code>12key</code> 998</p> 999 1000<p>Bằng cách so sánh cấu hình thiết bị với các tài nguyên thay thế sẵn có, Android sẽ lựa chọn 1001nội dung vẽ được từ {@code drawable-en-port}.</p> 1002 1003<p>Hệ thống ra quyết định của mình về các tài nguyên nào sẽ sử dụng bằng lô-gic 1004sau:</p> 1005 1006 1007<div class="figure" style="width:371px"> 1008<img src="{@docRoot}images/resources/res-selection-flowchart.png" alt="" height="471" /> 1009<p class="img-caption"><strong>Hình 2.</strong> Lưu đồ về cách Android tìm tài nguyên 1010khớp tốt nhất.</p> 1011</div> 1012 1013 1014<ol> 1015 <li>Loại bỏ các tệp tài nguyên mà trái với cấu hình thiết bị. 1016 <p>Thư mục <code>drawable-fr-rCA/</code> bị loại bỏ vì nó 1017trái với bản địa <code>en-GB</code>.</p> 1018<pre class="classic no-pretty-print"> 1019drawable/ 1020drawable-en/ 1021<strike>drawable-fr-rCA/</strike> 1022drawable-en-port/ 1023drawable-en-notouch-12key/ 1024drawable-port-ldpi/ 1025drawable-port-notouch-12key/ 1026</pre> 1027<p class="note"><strong>Ngoại lệ:</strong> Mật độ điểm ảnh màn hình là một hạn định không 1028bị loại bỏ do trái ngược. Mặc dù mật độ màn hình của thiết bị là hdpi, 1029<code>drawable-port-ldpi/</code> không bị loại bỏ vì mọi mật độ màn hình đều 1030được coi là một kết quả khớp tại thời điểm này. Bạn có thể tham khảo thêm thông tin trong tài liệu <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ Nhiều 1031Màn hình</a>.</p></li> 1032 1033 <li>Chọn hạn định có mức ưu tiên cao nhất (tiếp theo) trong danh sách (<a href="#table2">bảng 2</a>). 1034(Bắt đầu bằng MCC, sau đó di chuyển xuống.) </li> 1035 <li>Có thư mục tài nguyên nào bao gồm hạn định này không? </li> 1036 <ul> 1037 <li>Nếu Không, hãy quay lại bước 2 và tìm với hạn định tiếp theo. (Trong ví dụ, 1038 câu trả lời là "không" tới khi đi đến hạn định ngôn ngữ.)</li> 1039 <li>Nếu Có, tiếp tục sang bước 4.</li> 1040 </ul> 1041 </li> 1042 1043 <li>Loại bỏ các thư mục tài nguyên không bao gồm hạn định này. Trong ví dụ, hệ thống 1044sẽ loại bỏ tất cả thư mục không bao gồm hạn định ngôn ngữ:</li> 1045<pre class="classic no-pretty-print"> 1046<strike>drawable/</strike> 1047drawable-en/ 1048drawable-en-port/ 1049drawable-en-notouch-12key/ 1050<strike>drawable-port-ldpi/</strike> 1051<strike>drawable-port-notouch-12key/</strike> 1052</pre> 1053<p class="note"><strong>Ngoại lệ:</strong> Nếu hạn định đang xét là mật độ điểm ảnh màn hình, 1054Android sẽ chọn tùy chọn khớp gần nhất với mật độ màn hình của thiết bị. 1055Nhìn chung, Android ưu tiên giảm kích cỡ một hình ảnh ban đầu lớn hơn thay vì tăng kích cỡ một hình ảnh ban đầu 1056nhỏ hơn. Xem phần <a href="{@docRoot}guide/practices/screens_support.html">Hỗ trợ Nhiều 1057Màn hình</a>.</p> 1058 </li> 1059 1060 <li>Quay lại và lặp lại các bước 2, 3 và 4 tới khi chỉ còn lại một thư mục. Trong ví dụ, hướng 1061màn hình là hạn định tiếp theo nếu có kết quả khớp. 1062Vì thế, các tài nguyên không quy định hướng màn hình sẽ bị loại bỏ: 1063<pre class="classic no-pretty-print"> 1064<strike>drawable-en/</strike> 1065drawable-en-port/ 1066<strike>drawable-en-notouch-12key/</strike> 1067</pre> 1068<p>Thư mục còn lại là {@code drawable-en-port}.</p> 1069 </li> 1070</ol> 1071 1072<p>Mặc dù quy trình này được thực thi cho từng tài nguyên được yêu cầu, hệ thống sẽ tối ưu hóa hơn nữa 1073một số khía cạnh. Một cách tối ưu hóa như vậy đó là sau khi biết cấu hình thiết bị, nó có thể 1074loại bỏ các tài nguyên thay thế mà không thể khớp được. Ví dụ, nếu ngôn ngữ cấu hình 1075là English ("en"), khi đó bất kỳ thư mục tài nguyên nào có hạn định ngôn ngữ được đặt thành 1076ngôn ngữ khác English đều sẽ không được bao gồm trong tập hợp các tài nguyên được kiểm tra (mặc dù 1077thư mục tài nguyên <em>không có</em> hạn định ngôn ngữ vẫn được bao gồm).</p> 1078 1079<p>Khi lựa chọn tài nguyên dựa trên hạn định kích cỡ màn hình, hệ thống sẽ sử dụng các tài nguyên 1080được thiết kế cho màn hình nhỏ hơn màn hình hiện tại nếu không có tài nguyên nào khớp tốt hơn 1081(ví dụ, một màn hình kích cỡ lớn sẽ sử dụng các tài nguyên màn hình kích cỡ bình thường nếu cần). Tuy nhiên, nếu 1082những tài nguyên duy nhất sẵn có lại <em>lớn hơn</em> màn hình hiện tại, hệ thống sẽ 1083<strong>không</strong> sử dụng chúng và ứng dụng của bạn sẽ bị lỗi nếu không có tài nguyên nào khác khớp với cấu hình 1084thiết bị (ví dụ, nếu tất cả tài nguyên bố trí đều được gắn thẻ bằng hạn định {@code xlarge}, 1085nhưng thiết bị lại có một màn hình kích cỡ bình thường).</p> 1086 1087<p class="note"><strong>Lưu ý:</strong> <em>Mức ưu tiên</em> của hạn định (trong <a href="#table2">bảng 2</a>) quan trọng 1088hơn số lượng hạn định khớp chính xác với thiết bị. Ví dụ, trong bước 4 bên trên 1089lựa chọn trên danh sách bao gồm ba hạn định khớp chính xác với thiết bị (hướng, loại 1090màn hình cảm ứng, và phương pháp nhập liệu), trong khi <code>drawable-en</code> chỉ có một tham số khớp 1091(ngôn ngữ). Tuy nhiên, ngôn ngữ có mức ưu tiên cao hơn cả ba hạn định khác này, vì thế 1092<code>drawable-port-notouch-12key</code> bị loại.</p> 1093 1094<p>Để tìm hiểu thêm về cách sử dụng tài nguyên trong ứng dụng của bạn, hãy tiếp tục sang phần <a href="accessing-resources.html">Truy cập Tài nguyên</a>.</p> 1095