• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &lt;resources&gt;} lại định nghĩa một tài nguyên
163duy nhất. Ví dụ, phần tử {@code &lt;string&gt;} tạo tài nguyên
164{@code R.string} và phần tử {@code &lt;color&gt;} 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/}&mdash;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>&lt;resources_name&gt;</em>-<em>&lt;config_qualifier&gt;</em>}.
228    <ul>
229      <li><em>{@code &lt;resources_name&gt;}</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 &lt;qualifier&gt;}</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 &lt;qualifier&gt;}</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&mdash;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&lt;N&gt;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 &lt;N&gt;} 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&lt;N&gt;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&mdash;được định nghĩa bởi giá trị <code>&lt;N&gt;</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&lt;N&gt;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&mdash;được định nghĩa bởi giá trị <code>&lt;N&gt;</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ó&mdash;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 &lt;bitmap&gt;}. Đ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 &lt;bitmap&gt;}.
872Ví dụ:</p>
873
874<pre>
875&lt;?xml version="1.0" encoding="utf-8"?>
876&lt;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 &lt;include&gt;}
889, được bọc trong một {@code &lt;merge&gt;}. Ví dụ:</p>
890
891<pre>
892&lt;?xml version="1.0" encoding="utf-8"?>
893&lt;merge>
894    &lt;include layout="@layout/main_ltr"/>
895&lt;/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&lt;?xml version="1.0" encoding="utf-8"?>
910&lt;resources>
911    &lt;string name="hello">Hello&lt;/string>
912    &lt;string name="hi">@string/hello&lt;/string>
913&lt;/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&lt;?xml version="1.0" encoding="utf-8"?>
923&lt;resources>
924    &lt;color name="yellow">#f00&lt;/color>
925    &lt;color name="highlight">@color/red&lt;/color>
926&lt;/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ữ đó&mdash;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