lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Cung cấp Tài nguyên

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 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ể.

Nhóm các Loại Tài nguyên lại

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 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 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ụcmipmap/ 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.

Bảng 1. Các thư mục tài nguyên được hỗ trợ bên trong thư mục res/ của 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 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 (.png, .9.png, .jpg, .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:

  • Tệp bitmap
  • Nine-Patche (tệp bitmap có thể thay đổi kích cỡ)
  • Danh sách trạng thái
  • Hình
  • Nội dung vẽ được hoạt hình
  • Nội dung vẽ được khác

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 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 InputStream thô này, hãy gọi Resources.openRawResource() bằng ID tài nguyên, chính là R.raw.<em>filename</em>.

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 assets/ (thay vì res/raw/). Các tệp trong 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 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 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 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ử &lt;resources&gt; lại định nghĩa một tài nguyên duy nhất. Ví dụ, phần tử &lt;string&gt; tạo tài nguyên R.string và phần tử &lt;color&gt; tạo tài nguyên 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 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 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.

Cung cấp Tài nguyên Thay thế

Hình 1. 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.

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:

  1. Tạo một thư mục mới trong res/ có tên theo dạng <em>&lt;resources_name&gt;</em>-<em>&lt;config_qualifier&gt;</em>.
    • &lt;resources_name&gt; là tên thư mục của các tài nguyên mặc định tương ứng (được định nghĩa trong bảng 1).
    • &lt;qualifier&gt; là tên quy định một cấu hình riêng mà những tài nguyên này sẽ được sử dụng cho nó (được định nghĩa trong bảng 2).

    Bạn có thể nối nhiều hơn một &lt;qualifier&gt;. 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.

  2. 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 đặt tên đúng như các tệp tài nguyên mặc định.

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 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 icon.png hoặc hình ảnh 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.

Bảng 2. Tên của hạn định cấu hình.

Cấu hình Giá trị Hạn định Mô tả
MCC và MNC Ví dụ:
mcc310
mcc310-mnc004
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ụ, mcc310 ở Hoa Kỳ đối với mọi nhà mạng, mcc310-mnc004 ở Hoa Kỳ đối với Verizon, và mcc208-mnc00 ở Pháp đối với Orange.

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 mcc, và 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à "r" chữ thường).

Các mã không phân biệt chữ hoa/thường; tiền tố 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 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. ldrtl có nghĩa là "chỉ-hướng-bố-trí-phải-qua-trái". 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 supportsRtl thành "true" và đặt 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 &lt;N&gt; 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í, 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:

  • 320, cho các thiết bị có cấu hình màn hình như:
    • 240x320 ldpi (thiết bị cầm tay QVGA)
    • 320x480 mdpi (thiết bị cầm tay)
    • 480x800 hdpi (thiết bị cầm tay mật độ cao)
  • 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).
  • 600, đối với những màn hình như 600x1024 mdpi (máy tính bảng 7").
  • 720, đối với những màn hình như 720x1280 mdpi (máy tính bảng 10").

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 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 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ị dp mà tại đó, tài nguyên nên được sử dụng—được định nghĩa bởi giá trị <N>. Giá trị cấu hình này sẽ thay đổi khi hướng thay đổi giữa khổ ngang và dọc để khớp với chiều rộng thực tế hiện tại.

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 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ị <N>. Giá trị cấu hình này sẽ thay đổi khi hướng thay đổi giữa khổ ngang và dọc để khớp với chiều cao thực tế hiện tại.

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 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
  • small: Các màn hình có kích cỡ tương tự như màn hình QVGA mật độ thấp. Kích cỡ bố trí tối thiểu đối với một màn hình nhỏ bằng xấp xỉ 320x426 đơn vị dp. Các ví dụ như QVGA mật độ thấp và VGA mật độ cao.
  • normal: Các màn hình có kích cỡ tương tự như màn hình HVGA mật độ trung bình. Kích cỡ bố trí tối thiểu đối với một màn hình bình thường bằng xấp xỉ 320x470 đơn vị dp. Ví dụ về những màn hình như vậy là WQVGA mật độ thấp, HVGA mật độ trung bình, WVGA mật độ cao.
  • large: Các màn hình có kích cỡ tương tự như màn hình VGA mật độ trung bình. 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. Ví dụ như các màn hình mật độ trung bình VGA và WVGA.
  • xlarge: Các màn hình lớn hơn đáng kể so với màn hình 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 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 siêu lớn sẽ quá lớn để mang trong túi và gần như là thiết bị kiểu máy tính bảng. Được thêm trong API mức 9.

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 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 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
  • long: Màn hình dài, chẳng hạn như WQVGA, WVGA, FWVGA
  • notlong: Màn hình không dài, chẳng hạn như QVGA, HVGA và VGA

Đượ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 screenLayout, ở đó cho biết màn hình có dài không.

Hướng của màn hình port
land
  • port: Thiết bị ở hướng đứng (thẳng đứng)
  • land: Thiết bị ở khổ ngang (nằm ngang)

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 orientation, trong đó cho biết hướng thiết bị hiện tại.

Chế độ UI car
desk
television
appliance watch
  • car: Thiết bị đang hiển thị trong đế gắn trên ô-tô
  • desk: Thiết bị đang hiển thị trong đế gắn trên bàn
  • television: Thiết bị đang hiển thị trên một TV, mang đến một 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 cách xa người dùng, được định hướng chủ yếu quanh DPAD hoặc cách tương tác không sử dụng con trỏ khác
  • appliance: Thiết bị đang đóng vai trò như một dụng cụ không có màn hình hiển thị
  • watch: Thiết bị có một màn hình hiển thị và được đeo trên cổ tay

Đượ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 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
  • night: Thời gian ban đêm
  • notnight: Thời gian ban ngày

Đượ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 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
  • ldpi: Màn hình mật độ thấp; xấp xỉ 120dpi.
  • mdpi: Màn hình mật độ trung bình (trên HVGA truyền thống); xấp xỉ 160dpi.
  • hdpi: Màn hình mật độ cao; xấp xỉ 240dpi.
  • xhdpi: Màn hình mật độ siêu cao; xấp xỉ 320dpi. Được thêm trong API Mức 8
  • xxhdpi: Màn hình mật độ siêu siêu cao; xấp xỉ 480dpi. Được thêm trong API Mức 16
  • 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 ghi chú trong Hỗ trợ Nhiều Màn hình); xấp xỉ 640dpi. Được thêm trong API Mức 18
  • 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ỡ cho khớp với mật độ của thiết bị.
  • tvdpi: Màn hình trong khoảng giữa mdpi và hdpi; xấp xỉ 213dpi. Đây khô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 cá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 và 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.

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
  • notouch: Thiết bị không có màn hình cảm ứng.
  • finger: Thiết bị có màn hình cảm ứng để được sử dụng thông qua tương tác hướng của ngón tay của người dùng.

Xem thêm trường cấu hình 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
  • keysexposed: Thiết bị có sẵn một bàn phím. Nếu thiết bị có một bà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 không 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ó bà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 hiển thị.
  • keyshidden: Thiết bị có sẵn một bàn phím cứng nhưng nó bị ẩn đi thiết bị không có bàn phím mềm được kích hoạt.
  • keyssoft: Thiết bị có một bàn phím mềm được kích hoạt dù nó có hiển thị hay không.

Nếu bạn cung cấp các tài nguyên keysexposed, nhưng không cung cấp tài nguyên keyssoft , hệ thống sẽ sử dụng tài nguyên keysexposed mà không phụ thuộc vào việc có hiển thị bà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.

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 hardKeyboardHiddenkeyboardHidden, 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
  • nokeys: Thiết bị không có phím cứng cho việc nhập liệu văn bản.
  • qwerty: Thiết bị có một bàn phím qwerty cứng, dù nó có hiển thị với người dùng hay không.
  • 12key: Thiết bị có một bàn phím 12-phím cứng, dù nó có hiển thị với người dùng hay không.

Xem thêm trường cấu hình keyboard, trong đó cho biết phương pháp nhập liệu văn bản chính 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ụ, v1 đối với API mức 1 (thiết bị ở phiên bản Android 1.0 hoặc cao hơn) và v4 đối với API mức 4 (thiết bị ở phiên bản Android 1.6 hoặc cao hơn). Xem tài liệu Mức API của Android để biết thêm thông tin về những giá trị này.

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.

Quy tắc về tên hạn định

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:

  • 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í dụ, drawable-en-rUS-land sẽ áp dụng cho các thiết bị US-English ở hướng khổ ngang.
  • Các hạn định phải theo thứ tự liệt kê trong bảng 2. Ví dụ:
    • Sai: drawable-hdpi-port/
    • Đúng: drawable-port-hdpi/
  • 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ó res/drawable/drawable-en/.
  • 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 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 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.
  • 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 cùng các tệp vẽ được cho tiếng Tây Ban Nha và tiếng Pháp, bạn không thể đặt tên thư mục là 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/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).

Tạo tài nguyên bí danh

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 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, 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 icon_ca.png (bất kỳ tên nào khác ngoài icon.png) và đặt nó vào thư mục res/drawable/ mặc định. Sau đó, tạo một tệp icon.xml trong res/drawable-en-rCA/res/drawable-fr-rCA/ tham chiếu tới tài nguyên icon_ca.png bằng cách sử dụng phần tử &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 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.)

Nội dung vẽ được

Để 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ử &lt;bitmap&gt;. 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 icon.xml (trong một thư mục tài nguyên thay thế chẳng hạn như 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à R.drawable.icon, nhưng thực tế lại là bí danh cho tài nguyên R.drawable.icon_ca (được lưu trong res/drawable/).

Bố trí

Để tạo một bí danh cho một bố trí hiện tại, hãy sử dụng phần tử &lt;include&gt; , được bọc trong một &lt;merge&gt;. 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 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à R.layout.main, nhưng thực tế lại là một bí danh cho tài nguyên R.layout.main_ltr .

Xâu và các giá trị đơn giản khác

Để 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 R.string.hi lúc này là một bí danh cho 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>

Cung cấp Tính tương thích giữa Thiết bị với Tài nguyên Tốt nhất

Để ứ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 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 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 layout-land/ cho khổ ngang và layout-port/ cho khổ dọc, hãy để một cái làm mặc định, chẳng hạn như layout/ đối với khổ ngang và 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 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 (night hoặc 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 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 drawable/ hoặc 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 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 độ.

Cách Android tìm Tài nguyên Khớp Tốt nhấ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ừ 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:

Hình 2. Lưu đồ về cách Android tìm tài nguyên khớp tốt nhất.

  1. Loại bỏ các tệp tài nguyên mà trái với cấu hình thiết bị.

    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.

  2. Chọn hạn định có mức ưu tiên cao nhất (tiếp theo) trong danh sách (bảng 2). (Bắt đầu bằng MCC, sau đó di chuyển xuống.)
  3. Có thư mục tài nguyên nào bao gồm hạn định này không?
    • 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ụ, câu trả lời là "không" tới khi đi đến hạn định ngôn ngữ.)
    • Nếu Có, tiếp tục sang bước 4.
  4. 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 sẽ loại bỏ tất cả thư mục không bao gồm hạn định ngôn ngữ:
  5. 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.

  6. 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 màn hình là hạn định tiếp theo nếu có kết quả khớp. Vì thế, các tài nguyên không quy định hướng màn hình sẽ bị loại bỏ:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    Thư mục còn lại là 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 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.