page.title=Cung cấp Tài nguyên parent.title=Tài nguyên Ứng dụng parent.link=index.html @jd:body
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ã củ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 cấ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 thờ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í dụ, 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 khác nhau phụ thuộc vào thiết đặt ngôn ngữ.
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 bằ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 tài nguyên trong ứng dụng của bạn được trình bày trong phần Truy cập Tài nguyên. 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à cung cấp tài nguyên thay thế cho những cấu hình thiết bị cụ thể.
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 {@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:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
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 cá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 , và một tệp tài nguyên xâu. Tên thư mục tài nguyên có vai trò quan trọng và được mô tả trong bảng 1.
Lưu ý: Để biết thêm thông tin về cách sử dụng thư mục mipmap, hãy xem phần Tổng quan về Quản lý Dự án.
Thư mục | Loại Tài nguyên |
---|---|
animator/ |
Tệp XML định nghĩa các hoạt hình tính chất. |
anim/ |
Tệp XML định nghĩa các hoạt hình tween. (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 thư mục {@code animator/} được ưu tiên cho hoạt hình tính chất để phân biệt giữa hai loại này.) |
color/ |
Tệp XML định nghĩa một danh sách trạng thái các màu. Xem phần Tài nguyên Danh sách Trạng thái Màu |
drawable/ |
Tệp bitmap ({@code .png}, {@code .9.png}, {@code .jpg}, {@code .gif}) hoặc tệp XML được biên dịch thành các loại tài nguyên con vẽ được sau:
Xem phần Tài nguyên Vẽ được. |
mipmap/ |
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ý các biểu tượng trình khởi chạy bằng thư mục {@code mipmap/}, xem phần Tổng quan về Quản lý Dự án. |
layout/ |
Tệp XML định nghĩa một bố trí giao diện người dùng. Xem phần Tài nguyên Bố trí. |
menu/ |
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 Con. Xem phần Tài nguyên Menu. |
raw/ |
Tệp tùy ý để lưu trong dạng thô của chúng. Để mở những tài nguyên có một {@link java.io.InputStream} thô này, hãy gọi {@link android.content.res.Resources#openRawResource(int) Resources.openRawResource()} bằng ID tài nguyên, chính là {@code R.raw.filename}. 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 lưu một số tài nguyên trong thư mục {@code assets/} (thay vì {@code res/raw/}). Các tệp trong {@code assets/} không được cấp ID 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}. |
values/ |
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. 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ẻ dựa trên tên tệp XML, tệp trong thư mục {@code values/} sẽ mô tả nhiều nguồn. Đố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 duy nhất. Ví dụ, phần tử {@code <string>} tạo tài nguyên {@code R.string} và phần tử {@code <color>} tạo tài nguyên {@code R.color} . 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 theo 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ể muố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 tên tệp cho các tài nguyên mà bạn có thể tạo trong thư mục này:
Xem các phần Tài nguyên Xâu, Tài nguyên Kiểu, và các Loại Tài nguyên khác. |
xml/ |
Tệp XML tùy ý mà có thể được đọc vào thời gian chạy bằng cách gọi {@link android.content.res.Resources#getXml(int) Resources.getXML()}. Các tệp cấu hình XML khác nhau phải được lưu ở đây, chẳng hạn như một cấu hình có thể tìm kiếm. |
Chú ý: Không được lưu tệp tài nguyên trực tiếp vào trong thư mục {@code res/}—nó sẽ gây ra lỗi với trình biên dịch.
Để biết thêm thông tin về các loại tài nguyên, hãy xem tài liệu Các Loại Tài nguyên.
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" củ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. Tuy 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. Ví 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 cá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ó thiế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 vă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 thiế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 mặc định của mình.
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 thiế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 độ mà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 sẽ phát hiện cấu hình thiết bị hiện tại và tải các tài nguyên tương ứng cho ứng dụng của bạn.
Để 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:
Bạn có thể nối nhiều hơn một {@code <qualifier>}. Tách riêng từng cái bằng một nét gạch.
Chú ý: Khi nối nhiều hạn định, bạn phải đặ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ự sai, tài nguyên sẽ bị bỏ qua.
Ví dụ, sau đây là một số tài nguyên mặc định và thay thế:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
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ó mà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 độ màn hình cụ thể, nhưng tên tệp thì giố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 background.png} luôn như nhau, nhưng Android sẽ chọn phiê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ị với các hạn định về tên thư mục tài nguyên.
Android hỗ trợ một vài hạn định cấu hình và bạn có thể thê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 liệ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 hạ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 bảng.
Cấu hình | Giá trị Hạn định | Mô tả |
---|---|---|
MCC và MNC | Ví dụ:mcc310
mcc208-mnc00 v.v. |
Mã quốc gia di động (MCC), đằng sau có thể là mã mạng di động (MNC)
từ thẻ SIM trong thiết bị. Ví dụ, 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 từ thẻ SIM. Bạn cũng có thể sử dụng chỉ MCC (ví dụ, để đưa các tài nguyên phá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 ngôn ngữ và khu vực để 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à MNC, bạn nên cẩn thận và kiểm tra xem nó có hoạt động như kỳ vọng không. Ngoài ra, cũng xem các trường cấu hình {@link android.content.res.Configuration#mcc}, và {@link android.content.res.Configuration#mnc}, tương ứng cho biết mã quốc gia di động và mã mạng di động hiện tại. |
Ngôn ngữ và khu vực | Ví dụ:en fr en-rUS fr-rFR fr-rCA v.v. |
Ngôn ngữ được định nghĩa bằng một mã ngôn ngữ ISO 639-1 gồm hai chữ cái, có thể theo sau là một mã khu vực ISO 3166-1-alpha-2 dài hai chữ cái (đằng trước là "{@code r}" chữ thường). Các mã không phân biệt chữ hoa/thường; tiền tố {@code r} được sử dụng để phân biệt phần khu vực. Bạn không thể chỉ quy định một khu vực. Điều 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 thay đổi ngôn ngữ của mình trong cài đặt hệ thống. Xem phần Xử lý Thay đổi Thời gian chạy để biết thông tin về ả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. Xem phần Bản địa hóa để biết hướng dẫn đầy đủ về việc bản địa hóa ứng dụng của bạn cho các ngôn ngữ khác. Xem thêm trường cấu hình {@link android.content.res.Configuration#locale}, trong đó cho biết địa phương hiện tại. |
Chỉ hướng Bố trí | ldrtl ldltr |
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". {@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. Đ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ị. 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 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: res/ layout/ main.xml (Default layout) layout-ar/ main.xml (Specific layout for Arabic) layout-ldrtl/ main.xml (Any "right-to-left" language, except for Arabic, because the "ar" language qualifier has a higher precedence.) Lưu ý: Để kích hoạt các tính năng bố trí phải-qua-trái cho ứng dụng của mình, bạn phải đặt {@code supportsRtl} thành {@code "true"} và đặt {@code targetSdkVersion} thành 17 trở lên. Được thêm trong API mức 17. |
smallestWidth | sw<N>dp Ví dụ: sw320dp sw600dp sw720dp v.v. |
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 khả 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 khả 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ể sử 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 của bạn có ít nhất {@code <N>} dp chiều rộng khả dụng cho UI của mình. 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 phả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 res/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 mà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 theo 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ị; smallestWidth của thiết bị không thay đổi khi hướng của màn hình thay đổi. 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í dụ, 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 theo trục smallestWidth, hệ thống sẽ khai báo smallestWidth nhỏ hơn kích cỡ màn hình thự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 nên là kích thước nhỏ nhất thực tế mà bố trí của bạn yêu cầu (thông thường, giá trị này bằng "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). 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:
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 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á) smallestWidth của thiết bị. Được thêm trong API mức 13. Xem thêm thuộc tính {@code android:requiresSmallestWidthDp}, trong đó khai báo smallestWidth tối thiểu mà ứng dụng của bạn tương thích với, và trường cấu hình {@link android.content.res.Configuration#smallestScreenWidthDp}, trong đó lưu trữ giá trị smallestWidth của thiết bị. Để 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 này, hãy xem hướng dẫn dành cho nhà phát triển Hỗ trợ Nhiều Màn hình. |
Chiều rộng khả dụng | w<N>dp Ví dụ: w720dp w1024dp v.v. |
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
nên được sử dụng—được định nghĩa bởi giá trị 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 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á) chiều rộng hiện tại của màn hình. Giá trị ở đây xét cả trang trí trên màn hình, vì thế nếu thiết bị có một số phần tử UI cố định ở cạnh trái hoặc phải của màn hình, nó 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 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. Được thêm trong API mức 13. Xem thêm trường cấu hình {@link android.content.res.Configuration#screenWidthDp} mà chứa chiều rộng màn hình hiện tại. Để 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 này, hãy xem hướng dẫn dành cho nhà phát triển Hỗ trợ Nhiều Màn hình. |
Chiều cao khả dụng | h<N>dp Ví dụ: h720dp h1024dp v.v. |
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
nên được sử dụng—được định nghĩa bởi giá trị 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 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á) chiều cao hiện tại của màn hình. Giá trị ở đây xét cả trang trí trên màn hình, vì thế nếu thiết bị có một số 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 một giá trị cho chiều cao nhỏ hơn kích cỡ màn hình thực sự, dùng 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í 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 ẩn khi ở toàn màn hình) không được xét ở đây, cả 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ị để xử lý một khoảng trống nhỏ hơn mức mà chúng quy định. Được thêm trong API mức 13. Xem thêm trường cấu hình {@link android.content.res.Configuration#screenHeightDp} mà chứa chiều rộng màn hình hiện tại. Để 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 này, hãy xem hướng dẫn dành cho nhà phát triển Hỗ trợ Nhiều Màn hình. |
Kích cỡ màn hình |
small normal large xlarge
|
Lưu ý: Việc sử dụng một hạn định kích cỡ không hàm ý rằng các tài nguyên chỉ á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 thay 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 bất kỳ tài nguyên nào phù hợp nhất. Chú ý: Nếu tất cả tài nguyên của bạn sử dụng một hạn định kích cỡ lớn hơn màn hình hiện tại, hệ thống sẽ không sử dụng chúng và ứ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 xlarge} nhưng thiết bị lại có màn hình kích cỡ bình thường). Được thêm trong API mức 4. Xem Hỗ trợ Nhiều Màn hình để biết thêm thông tin. Xem thêm trường cấu hình {@link android.content.res.Configuration#screenLayout}, ở đó cho biết màn hình là màn hình nhỏ, bình thường, hay lớn. |
Tỷ lệ màn hình |
long notlong
|
Được thêm trong API mức 4. 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ó không liên quan tới hướng của màn hình. Xem thêm trường cấu hình {@link android.content.res.Configuration#screenLayout}, ở đó cho biết màn hình có dài không. |
Hướng của màn hình |
port land
|
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 màn hình. Xem phần Xử lý Thay đổi Thời gian chạy để biế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. Xem thêm trường cấu hình {@link android.content.res.Configuration#orientation}, trong đó cho biết hướng thiết bị hiện tại. |
Chế độ UI |
car desk television appliance
watch
|
Được thêm trong API mức 8, TV được thêm trong API 13, đồng hồ được thêm trong API 20. Để 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 rút khỏi đế, hãy đọc Xác định và Theo dõi Trạng thái và Loại Đế. 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 thiế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 android.app.UiModeManager}. Xem phần Xử lý Thay đổi Thời gian chạy để biế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. |
Chế độ ban đêm |
night notnight
|
Được thêm trong API mức 8. 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 để ở chế độ 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 hoặc vô hiệu hóa chế độ này bằng cách sử dụng {@link android.app.UiModeManager}. Xem phần Xử lý Thay đổi Thời gian chạy để biế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. |
Mật độ điểm ảnh màn hình (dpi) |
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi
|
Có tỷ lệ định cỡ 3:4:6:8:12:16 giữa sáu mật độ cơ bản (bỏ qua mật độ tvdpi). Vì thế, một tệp bimap 9x9 trong ldpi sẽ bằng 12x12 trong mdpi, 18x18 trong hdpi, 24x24 trong xhdpi, v.v. 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 mộ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í dụ, 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. Lưu ý: Việc sử dụng một hạn định mật độ không hàm ý rằng các tài nguyên chỉ á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 thay 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 bất kỳ tài nguyên nào phù hợp nhất. Xem Hỗ trợ Nhiều Màn hình để 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 có thể định cỡ bitmap của mình cho vừa với mật độ hiện tại. |
Loại màn hình cảm ứng |
notouch finger
|
Xem thêm trường cấu hình {@link android.content.res.Configuration#touchscreen}, nó cho biết loại màn hình cảm ứng trên thiết bị. |
Sự sẵn có của bàn phím |
keysexposed keyshidden keyssoft
|
Nếu bạn cung cấp các tài nguyên 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 cứng. Xem phần Xử lý Thay đổi Thời gian chạy để biế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. Xem thêm các trường cấu hình {@link android.content.res.Configuration#hardKeyboardHidden} và {@link android.content.res.Configuration#keyboardHidden}, theo đó tương ứng cho biết mức độ hiển thị của bàn phím cứ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). |
Phương pháp nhập liệu văn bản chính |
nokeys qwerty 12key
|
Xem thêm trường cấu hình {@link android.content.res.Configuration#keyboard}, trong đó cho biết phương pháp nhập liệu văn bản chính sẵn có. |
Sự sẵn có của phím điều hướng |
navexposed navhidden
|
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 phím điều hướng. Xem phần Xử lý Thay đổi Thời gian chạy để biế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. Xem thêm trường cấu hình {@link android.content.res.Configuration#navigationHidden}, ở đó có cho biết các phím điều hướng có bị ẩn không. |
Phương pháp điều hướng không cảm ứng chính |
nonav dpad trackball wheel
|
Xem thêm trường cấu hình {@link android.content.res.Configuration#navigation}, trong đó cho biết loại phương pháp điều hướng sẵn có. |
Phiên bản Nền tảng (Mức API) | Ví dụ:v3 v4 v7 v.v. |
Mức API được hỗ trợ bởi thiết bị. Ví dụ, |
Lưu ý: Một số hạn định cấu hình đã được thêm kể từ phiên bản Android
1.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 ý
thê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
một hạn định w600dp
sẽ tự động bao gồm hạn định v13
, vì
hạ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
các tài nguyên mặc định (tập hợp các tài nguyên không có hạn định). Để biết thêm thông tin, hãy xem phần
nói về Cung cấp Tính tương thích giữa Thiết bị với Tài nguyên
Tốt nhất.
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:
drawable-en-rUS-land
sẽ áp dụng cho các thiết bị US-English ở hướng
khổ ngang.drawable-hdpi-port/
drawable-port-hdpi/
res/drawable/drawable-en/
.drawable-rES-rFR/
. Thay vào đó, bạn cần hai thư mục tài nguyên chẳng hạn như
drawable-rES/
và drawable-rFR/
, trong đó chứa các tệp phù hợp.
Tuy 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ể
tạo một bí danh tới một tài nguyên. Xem phần Tạo
tài nguyên bí danh ở bên dưới.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 nhữ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 cấ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 thay thế chứa tệp tài nguyên được yêu cầu, rồi tìm tài nguyên so khớp phù hợp nhất (được trình bày ở bên dưới). Nếu không có tài nguyên thay thế khớp vớ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 ( tậ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 cấu hình).
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 thiế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 cù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 thay thế đó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.
Lưu ý: Không phải tất cả tài nguyên đều đưa ra cơ chế mà theo đó bạn có thể tạ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 không được quy định khác trong thư mục {@code xml/} không cung cấp tính năng này.
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 nó cho các bản địa khác nhau. Tuy nhiên, hai bản địa English-Canadian và French-Canadian, cần sử 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 vào thư mục tài nguyên cho cả English-Canadian và French-Canadian, nhưng điều đó khô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ỳ tên nào khác ngoài {@code icon.png}) và đặt nó vào thư mục {@code res/drawable/} mặc định. Sau đó, tạo một tệp {@code icon.xml} trong {@code res/drawable-en-rCA/} và {@code res/drawable-fr-rCA/} tham chiếu tới tài nguyên {@code icon_ca.png} bằ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 PNG 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.)
Để 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>}. Ví dụ:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
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ư {@code res/drawable-en-rCA/}), nó sẽ được biên dịch vào một tài nguyên mà bạn có 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 R.drawable.icon_ca} (được lưu trong {@code res/drawable/}).
Để 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>} , được bọc trong một {@code <merge>}. Ví dụ:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
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 như 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} .
Để 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 mong muốn làm giá trị cho xâu mới. Ví dụ:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
Tài nguyên {@code R.string.hi} lúc này là một bí danh cho {@code R.string.hello}.
Các giá trị đơn giản khác cũng hoạt động tương tự. Ví dụ, màu sắc:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="yellow">#f00</color> <color name="highlight">@color/red</color> </resources>
Để ứ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à bạ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.
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 values/} (trong đó, xâu của bạn được lưu) mà không cần một hạn định ngôn ngữ và khu vực. Nếu thay vào đó bạn đặt tất cả tệp xâu của mình và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 trê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 {@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 hiểu ngôn ngữ đó—vậy còn tốt hơn là bị lỗi).
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 chọ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 layout-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ư {@code layout/} đối với khổ ngang và {@code layout-port/} đối với khổ dọc.
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 cấ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 hạ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, như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 Android 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ó không thể sử dụng tài nguyên được đặt tên bằng hạn định mới. Ví dụ, nếu {@code minSdkVersion} 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 chế độ ban đêm ({@code night} hoặc {@code notnight}, đã được thêm trong API Mứ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 nà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 đó sao cho tài nguyên vẽ được của bạn ở trong {@code drawable/} hoặc {@code drawable-night/}.
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 mặ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 thay 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.
Có một ngoại lệ đối với quy tắc này: Nếu {@code minSdkVersion} của ứng dụng của bạn bằng 4 hoặc lớn hơn, bạn không cần đến tài nguyên vẽ được mặc định khi cung cấp tài nguyên vẽ được thay thế bằng hạn định mật độ màn hình. Kể cả khi không có tà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ỡ bitmap 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 cung cấp nội dung vẽ được thay thế cho cả ba loại mật độ.
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 tà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. Để diễ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, mỗi thư mục lại chứa các phiên bản khác nhau của cùng hình ảnh:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
Và giả sử cấu hình thiết bị như sau:
Bản địa = en-GB
Hướng màn hình = port
Mật độ điểm ảnh màn hình = hdpi
Loại màn hình cảm ứng = notouch
Phương pháp nhập liệu văn bản chính = 12key
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 nội dung vẽ được từ {@code drawable-en-port}.
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 sau:
Thư mục drawable-fr-rCA/
bị loại bỏ vì nó
trái với bản địa en-GB
.
drawable/ drawable-en/drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
Ngoại lệ: Mật độ điểm ảnh màn hình là một hạn định không
bị loại bỏ do trái ngược. Mặc dù mật độ màn hình của thiết bị là hdpi,
drawable-port-ldpi/
không bị loại bỏ vì mọi mật độ màn hình đều
đượ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 Hỗ trợ Nhiều
Màn hình.
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Ngoại lệ: Nếu hạn định đang xét là mật độ điểm ảnh màn hình, Android 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ị. Nhì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 nhỏ hơn. Xem phần Hỗ trợ Nhiều Màn hình.
drawable-en/drawable-en-port/drawable-en-notouch-12key/
Thư mục còn lại là {@code drawable-en-port}.
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 mộ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ể loạ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 là 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 ngô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ù thư mục tài nguyên không có hạn định ngôn ngữ vẫn được bao gồm).
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 đượ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 (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 những tài nguyên duy nhất sẵn có lại lớn hơn màn hình hiện tại, hệ thống sẽ không 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 thiế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}, nhưng thiết bị lại có một màn hình kích cỡ bình thường).
Lưu ý: Mức ưu tiên của hạn định (trong bảng 2) quan trọng
hơ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
lự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
màn hình cảm ứng, và phương pháp nhập liệu), trong khi drawable-en
chỉ có một tham số khớp
(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ế
drawable-port-notouch-12key
bị loại.
Để 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 Truy cập Tài nguyên.