Sumber daya adalah file tambahan dan konten statis yang digunakan kode Anda, seperti bitmap, penetapan layout, string antarmuka pengguna, instruksi animasi, dan banyak lagi.
Anda harus selalu mengeksternalkan sumber daya aplikasi seperti gambar dan string dari kode, agar Anda bisa memeliharanya secara independen. Anda juga harus menyediakan sumber daya alternatif untuk konfigurasi perangkat tertentu, dengan mengelompokkannya dalam direktori sumber daya bernama khusus. Saat waktu proses, Android menggunakan sumber daya yang sesuai berdasarkan konfigurasi saat ini. Misalnya, Anda mungkin ingin memberikan layout UI yang berbeda bergantung pada ukuran layar atau string berbeda bergantung pada setelan bahasa.
Setelah mengeksternalkan sumber daya aplikasi, Anda bisa mengaksesnya menggunakan ID sumber daya yang dibuat dalam class R
project Anda. Dokumen ini menunjukkan kepada Anda bagaimana mengelompokkan sumber daya Anda dalam project Android dan memberikan sumber daya alternatif untuk konfigurasi perangkat tertentu, dan kemudian mengaksesnya dari kode aplikasi Anda atau file XML lainnya.
Mengelompokkan tipe sumber daya
Anda harus menempatkan setiap tipe sumber daya dalam subdirektori spesifik pada direktori res/
project. Misalnya, inilah hierarki file untuk proyek sederhana:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
Seperti yang Anda lihat dalam contoh ini, direktori res/
berisi semua sumber daya (dalam subdirektori): satu sumber daya gambar, dua sumber daya layout, beberapa direktori mipmap/
untuk ikon peluncur, dan satu file sumber daya string. Nama direktori sumber daya penting dan dijelaskan dalam tabel 1.
Catatan: Untuk informasi selengkapnya tentang menggunakan folder mipmap, baca Mengelola Ringkasan Project.
Tabel 1. Direktori sumber daya didukung dalam direktori res/
project.
Direktori | Tipe Sumber Daya |
---|---|
animator/ |
File XML yang menetapkan animasi properti. |
anim/ |
File XML yang menetapkan animasi tween. (Animasi properti juga bisa disimpan dalam direktori ini, namun direktori animator/ lebih disukai bagi animasi properti agar kedua tipe ini dapat dibedakan.) |
color/ |
File XML yang mendefinisikan daftar status warna. Lihat Sumber Daya Daftar Status Warna |
drawable/ |
File bitmap (
Lihat Sumber Daya Drawable. |
mipmap/ |
File sumber daya dapat digambar untuk beragam kepadatan ikon peluncur. Untuk informasi selengkapnya tentang mengelola ikon peluncur dengan folder mipmap/ , lihat Mengelola Ringkasan Project. |
layout/ |
File XML yang mendefinisikan layout antarmuka pengguna. Lihat Sumber Daya Layout. |
menu/ |
File XML yang menetapkan menu aplikasi, seperti Menu Opsi, Menu Konteks, atau Sub Menu. Lihat Sumber Daya Menu. |
raw/ |
File arbitrer yang akan disimpan dalam bentuk mentah. Untuk membuka sumber daya ini dengan Akan tetapi, jika butuh akses ke nama file asal dan hierarki file, Anda bisa mempertimbangkan untuk menyimpan beberapa sumber daya dalam direktori |
values/ |
File XML yang berisi nilai-nilai sederhana, seperti string, integer, dan warna. Karena file sumber daya XML dalam subdirektori Karena setiap sumber daya ditetapkan dengan elemen XML-nya sendiri, Anda bisa bebas menamai file ini dan menempatkan tipe sumber daya berbeda dalam satu file. Akan tetapi, agar jelas, Anda mungkin perlu menempatkan tipe sumber daya unik dalam file berbeda. Misalnya, berikut ini adalah beberapa ketentuan penamaan file untuk sumber daya yang dapat Anda buat dalam direktori ini:
Lihat Sumber Daya String, Sumber Daya Gaya, dan Tipe Sumber Daya Lainnya. |
xml/ |
File XML arbitrer yang bisa dibaca saat waktu proses dengan memanggil Resources.getXML() . Berbagai file konfigurasi XML harus disimpan di sini, seperti konfigurasi yang dapat dicari.
|
font/ |
File font dengan ekstensi seperti .ttf , .otf , atau .ttc , atau file XML yang menyertakan elemen <font-family> . Untuk informasi selengkapnya tentang font sebagai sumber daya, buka Font dalam XML.
|
Perhatian: Jangan menyimpan file sumber daya secara langsung dalam direktori res/
—karena akan menyebabkan kesalahan compiler.
Untuk informasi selengkapnya tentang tipe sumber daya tertentu, lihat dokumentasi Tipe Sumber Daya.
Sumber daya yang disimpan dalam subdirektori yang didefinisikan dalam tabel 1 adalah sumber daya "default" Anda. Artinya, sumber daya ini menentukan desain dan konten default untuk aplikasi Anda. Namun, berbagai jenis perangkat yang diberdayakan Android mungkin membutuhkan berbagai jenis sumber daya. Misalnya, jika perangkat memiliki layar lebih besar dari layar normal, maka Anda harus menyediakan sumber daya tata letak yang berbeda yang memanfaatkan ruang layar ekstra. Atau, jika perangkat memiliki setelan bahasa berbeda, maka Anda harus menyediakan sumber daya string berbeda yang menerjemahkan teks dalam antarmuka pengguna Anda. Untuk menyediakan sumber daya berbeda ini bagi konfigurasi perangkat yang berbeda, Anda harus menyediakan sumber daya alternatif, selain sumber daya default.
Menyediakan sumber daya alternatif
Hampir setiap aplikasi harus menyediakan sumber daya alternatif untuk mendukung konfigurasi perangkat tertentu. Misalnya, Anda harus menyertakan sumber daya dapat digambar alternatif untuk kepadatan layar berbeda dan sumber daya string alternatif untuk bahasa yang berbeda. Saat waktu proses, Android akan mendeteksi konfigurasi perangkat aktif dan memuat sumber daya yang sesuai untuk aplikasi Anda.

Gambar 1. Dua perangkat berbeda, masing-masing menggunakan sumber daya layout berbeda.
Untuk menyebutkan alternatif konfigurasi tertentu untuk satu set sumber daya:
- Buat direktori baru dalam
res/
yang dinamai dalam formulir<resources_name>-<config_qualifier>
.<resources_name>
adalah nama direktori resource default terkait (yang didefinisikan dalam tabel 1).<qualifier>
adalah nama yang menetapkan konfigurasi individual yang akan digunakan sumber daya ini (yang didefinisikan dalam tabel 2).
Anda bisa menambahkan lebih dari satu
<qualifier>
. Pisahkan masing-masing dengan tanda hubung.Perhatian: Saat menambahkan beberapa qualifier, Anda harus menempatkannya dalam urutan yang sama dengan yang tercantum dalam tabel 2. Jika urutan qualifier salah, sumber daya akan diabaikan.
- Simpan masing-masing sumber daya alternatif dalam direktori baru ini. File sumber daya harus dinamai sama persis dengan file sumber daya default.
Misalnya, berikut ini beberapa sumber daya default dan sumber daya alternatif:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
Qualifier hdpi
menunjukkan bahwa sumber daya dalam direktori itu diperuntukkan bagi perangkat dengan layar kepadatan tinggi. Gambar di masing-masing direktori sumber daya dapat digambar memiliki ukuran untuk kepadatan layar tertentu, namun nama filenya persis sama. Dengan demikian, ID sumber daya yang Anda gunakan untuk mereferensikan gambar icon.png
atau background.png
selalu sama, namun Android memilih versi masing-masing sumber daya yang paling cocok dengan perangkat saat ini, dengan membandingkan informasi konfigurasi perangkat dengan qualifier dalam nama direktori sumber daya.
Android mendukung beberapa qualifier konfigurasi dan Anda dapat menambahkan beberapa qualifier ke satu nama direktori, dengan memisahkan setiap qualifier dengan tanda hubung. Tabel 2 berisi daftar qualifier konfigurasi yang valid, dalam urutan prioritas—jika Anda menggunakan beberapa qualifier sebagai direktori sumber daya, Anda harus menambahkannya ke nama direktori sesuai urutan yang tercantum dalam tabel.
Tabel 2. Nama-nama qualifier konfigurasi.
Konfigurasi | Nilai-nilai Qualifier | Keterangan |
---|---|---|
MCC dan MNC | Contoh:mcc310
mcc208-mnc00 dll. |
Kode negara seluler (MCC), secara opsional diikuti oleh kode jaringan seluler (MNC) dari kartu SIM dalam perangkat. Misalnya, Jika perangkat menggunakan koneksi radio (ponsel GSM), nilai-nilai MCC dan MNC berasal dari kartu SIM. Anda juga dapat menggunakan MCC saja (misalnya, untuk menyertakan sumber daya legal spesifik untuk negara itu di aplikasi Anda). Jika Anda perlu menetapkan hanya berdasarkan bahasa, maka gunakan qualifier bahasa dan region sebagai gantinya (akan dibahas nanti). Jika Anda memutuskan untuk menggunakan qualifier MCC dan MNC, Anda harus melakukannya dengan hati-hati dan menguji apakah qualifier itu berjalan sesuai harapan. Lihat juga bidang konfigurasi |
Bahasa dan wilayah | Contoh:en fr en-rUS fr-rFR fr-rCA b+en b+en+US b+es+419 |
Bahasa didefinisikan oleh kode bahasa dua huruf ISO 639-1, bisa juga diikuti dengan kode region dua huruf ISO 3166-1-alpha-2 (diawali dengan huruf kecil Kode tidak membedakan huruf besar atau kecil; awalan Android 7.0 (API level 24) memperkenalkan dukungan untuk tag bahasa BCP 47, yang dapat Anda gunakan untuk mengkualifikasikan sumber daya khusus bahasa dan region. Tag bahasa terdiri dari urutan satu atau beberapa subtag, yang masing-masing memperhalus atau mempersempit rentang bahasa yang diidentifikasi oleh keseluruhan tag. Untuk informasi lebih lanjut tentang tag bahasa, lihat Tag untuk Mengidentifikasi Bahasa. Untuk menggunakan tag bahasa BCP 47, gabungkan
Tag bahasa dapat berubah selama masa pakai aplikasi Anda jika pengguna mengubah bahasanya dalam setelan sistem. Lihat Menangani Perubahan Waktu Proses untuk informasi tentang bagaimana hal ini dapat memengaruhi aplikasi Anda selama waktu proses. Lihat Pelokalan untuk panduan lengkap melokalkan aplikasi Anda ke bahasa lain. Lihat juga metode |
Arah Layout | ldrtl ldltr |
Arah layout aplikasi Anda. Ini bisa berlaku untuk sumber daya mana pun seperti layout, sumber daya dapat digambar, atau nilai-nilai. Misalnya, jika Anda ingin memberikan beberapa layout khusus untuk bahasa Arab dan beberapa layout umum untuk setiap bahasa lainnya yang menggunakan "kanan ke kiri" lainnya (seperti bahasa Persia atau Ibrani) maka Anda akan memiliki: 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.) Catatan: Untuk mengaktifkan fitur layout kanan ke kiri untuk aplikasi, Anda harus menyetel Ditambahkan dalam API level 17. |
smallestWidth | sw<N>dp Contoh: sw320dp sw600dp sw720dp dll. |
Ukuran dasar layar, sebagaimana yang ditunjukkan oleh dimensi terpendek dari area layar yang tersedia. Khususnya, smallestWidth perangkat adalah yang terpendek dari tinggi dan lebar layar yang tersedia (Anda dapat menganggapnya sebagai "lebar terkecil yang memungkinkan" untuk layar). Anda bisa menggunakan qualifier ini untuk memastikan bahwa, apa pun orientasi layar saat ini, aplikasi Anda memiliki paling tidak
Misalnya, jika layout mengharuskan dimensi layar terkecilnya setiap saat paling tidak 600 dp, maka Anda bisa menggunakan qualifier ini untuk membuat sumber daya layout, Penggunaan lebar terkecil untuk menentukan ukuran layar umum sangatlah berguna karena lebar sering kali menjadi faktor penentu dalam mendesain layout. UI akan sering di-scroll secara vertikal, tetapi memiliki batasan yang cukup ketat untuk ruang minimum yang diperlukannya secara horizontal. Lebar yang tersedia juga merupakan faktor kunci dalam menentukan apakah akan menggunakan layout satu panel untuk handset ataukah layout multipanel untuk tablet. Sehingga, mungkin Anda perlu memperhatikan tentang ukuran lebar terkecil yang memungkinkan pada setiap perangkat. Lebar terkecil perangkat memperhitungkan dekorasi layar dan UI sistem. Misalnya, jika perangkat memiliki beberapa elemen UI persisten pada layar yang memperhitungkan ruang di sepanjang sumbu dengan lebar terkecil, sistem menyatakan lebar terkecil menjadi lebih kecil dari ukuran layar sebenarnya, karena itu adalah piksel layar yang tidak tersedia untuk UI Anda. Sebagian nilai yang mungkin Anda gunakan di sini untuk ukuran layar umum:
Bila aplikasi Anda menyediakan beberapa direktori sumber daya dengan nilai yang berbeda untuk qualifier smallestWidth, sistem akan menggunakan nilai terdekat dengan (tanpa melebihi) smallestWidth perangkat. Ditambahkan dalam API level 13. Lihat juga atribut Untuk informasi selengkapnya tentang mendesain untuk layar berbeda dan menggunakan qualifier ini, lihat panduan developer Mendukung Multi Layar. |
Lebar yang tersedia | w<N>dp Contoh: w720dp w1024dp dll. |
Menetapkan lebar layar minimum yang tersedia, di satuan Hal ini sering kali berguna untuk menentukan apakah akan menggunakan layout multipanel, karena pada perangkat tablet sekalipun, sering kali Anda tidak akan menginginkan layout multipanel yang sama untuk orientasi potret seperti yang Anda lakukan untuk lanskap. Jadi, Anda bisa menggunakannya untuk menetapkan lebar minimum yang diperlukan untuk layout, daripada menggunakan kedua qualifier ukuran layar dan orientasi bersama-sama. Bila aplikasi Anda menyediakan beberapa direktori sumber daya dengan nilai yang berbeda untuk konfigurasi ini, sistem akan menggunakan nilai terdekat dengan (tanpa melebihi) lebar layar perangkat saat ini. Nilai di sini memperhitungkan dekorasi layar akun, jadi jika perangkat memiliki beberapa elemen UI persisten di tepi kiri atau kanan, layar menggunakan nilai lebar yang lebih kecil daripada ukuran layar sebenarnya, yang memperhitungkan elemen UI ini dan mengurangi ruang aplikasi yang tersedia. Ditambahkan dalam API level 13. Lihat juga bidang konfigurasi Untuk informasi selengkapnya tentang mendesain untuk layar berbeda dan menggunakan qualifier ini, lihat panduan developer Mendukung Multi Layar. |
Tinggi yang tersedia | h<N>dp Contoh: h720dp h1024dp dll. |
Menetapkan tinggi layar minimum yang tersedia, dalam satuan "dp" yang harus digunakan sumber daya—bersama nilai yang didefinisikan oleh Menggunakan ini untuk menentukan tinggi yang dibutuhkan oleh layout Anda sangat berguna seperti Bila aplikasi menyediakan beberapa direktori sumber daya dengan nilai yang berbeda untuk konfigurasi ini, sistem akan menggunakan nilai yang terdekat dengan (tanpa melebihi) tinggi layar perangkat saat ini. Nilai di sini memperhitungkan dekorasi layar akun, jadi jika perangkat memiliki beberapa elemen UI persisten di tepi atas atau bawah, layar akan menggunakan nilai tinggi yang lebih kecil daripada ukuran layar sebenarnya, memperhitungkan elemen UI ini dan mengurangi ruang aplikasi yang tersedia. Dekorasi layar yang tidak tetap (misalnya bilah status (status-bar) ponsel yang bisa disembunyikan saat layar penuh) di sini tidak diperhitungkan, demikian pula dekorasi jendela seperti bilah judul atau bilah aksi, jadi aplikasi harus disiapkan untuk menangani ruang yang agak lebih kecil daripada yang ditetapkan. Ditambahkan dalam API level 13. Lihat juga bidang konfigurasi Untuk informasi selengkapnya tentang mendesain untuk layar berbeda dan menggunakan qualifier ini, lihat panduan developer Mendukung Multi Layar. |
Ukuran layar |
small normal large xlarge
|
Catatan: Menggunakan qualifier ukuran tidak berarti bahwa sumber daya hanya untuk layar ukuran itu saja. Jika Anda tidak menyediakan sumber daya alternatif dengan qualifier yang lebih cocok dengan konfigurasi perangkat saat ini, sistem dapat menggunakan sumber daya mana saja yang paling cocok. Perhatian: Jika semua sumber daya Anda menggunakan qualifier yang berukuran lebih besar daripada layar saat ini, sistem tidak akan menggunakannya dan aplikasi akan error saat waktu proses (misalnya, jika semua sumber daya layout ditandai dengan qualifier Ditambahkan dalam API level 4. Lihat Mendukung Beberapa Layar untuk informasi selengkapnya. Lihat juga bidang konfigurasi |
Aspek layar |
long notlong
|
Ditambahkan dalam API level 4. Ini berdasarkan sepenuhnya pada rasio aspek layar (layar "panjang" lebih lebar). Ini tidak terkait dengan orientasi layar. Lihat juga bidang konfigurasi |
Layar bulat |
round notround
|
Ditambahkan dalam API level 23. Lihat juga metode konfigurasi |
Wide Color Gamut |
widecg nowidecg
|
Ditambahkan dalam API level 26. Lihat juga metode konfigurasi |
High Dynamic Range (HDR) |
highdr lowdr
|
Ditambahkan dalam API level 26. Lihat juga metode konfigurasi |
Orientasi layar |
port land
|
Ini bisa berubah selama masa pakai aplikasi Anda jika pengguna memutar layar. Lihat Menangani Perubahan Waktu Proses untuk informasi tentang bagaimana hal ini memengaruhi aplikasi Anda selama waktu proses. Lihat juga bidang konfigurasi |
Mode UI |
car desk television appliance watch vrheadset
|
Ditambahkan dalam API level 8, televisi ditambahkan dalam API 13, jam ditambahkan dalam API 20. Untuk informasi tentang cara aplikasi merespons saat perangkat dimasukkan ke dalam atau dilepaskan dari dok-nya, bacalah Menentukan dan Memantau Kondisi dan Tipe Dok. Ini bisa berubah selama masa pakai aplikasi jika pengguna menempatkan perangkat di dok. Anda bisa mengaktifkan atau menonaktifkan sebagian mode ini menggunakan |
Mode malam |
night notnight
|
Ditambahkan dalam API level 8. Ini bisa berubah selama masa pakai aplikasi jika mode malam dibiarkan dalam mode otomatis (default), dalam hal ini perubahan mode berdasarkan pada waktu hari. Anda dapat mengaktifkan atau menonaktifkan mode ini menggunakan |
Densitas piksel layar (dpi) |
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi nnndpi
|
Terdapat rasio skala 3:4:6:8:12:16 antara enam kepadatan utama (dengan mengabaikan kepadatan tvdpi). Jadi bitmap 9x9 di ldpi adalah 12x12 di mdpi, 18x18 di hdpi, 24x24 di xhdpi dan seterusnya. Jika Anda memutuskan bahwa sumber daya gambar tidak terlihat cukup baik di televisi atau perangkat tertentu lainnya dan ingin mencoba sumber daya tvdpi, faktor skalanya adalah 1,33*mdpi. Misalnya, gambar 100px x 100px untuk layar mdpi harus 133px x 133px untuk tvdpi. Catatan: Menggunakan qualifier kepadatan tidak berarti sumber daya hanya untuk layar dengan kepadatan itu saja. Jika Anda tidak menyediakan sumber daya alternatif dengan qualifier yang lebih cocok dengan konfigurasi perangkat saat ini, sistem mungkin akan menggunakan sumber daya mana saja yang paling cocok. Lihat Mendukung Beberapa Layar untuk informasi selengkapnya tentang cara menangani kepadatan layar yang berbeda dan cara Android menurunkan skala bitmap Anda agar sesuai dengan kepadatan saat ini. |
Tipe layar sentuh |
notouch finger
|
Lihat juga bidang konfigurasi |
Ketersediaan keyboard |
keysexposed keyshidden keyssoft
|
Jika Anda menyediakan sumber daya Ini bisa berubah selama masa pakai aplikasi jika pengguna membuka keyboard hardware. Lihat Menangani Perubahan Waktu Proses untuk informasi tentang bagaimana hal ini memengaruhi aplikasi Anda selama waktu proses. Lihat juga bidang konfigurasi |
Metode masukan teks utama |
nokeys qwerty 12key
|
Lihat juga bidang konfigurasi |
Ketersediaan tombol navigasi |
navexposed navhidden
|
Ini bisa berubah selama masa pakai aplikasi jika pengguna menampilkan tombol navigasi. Lihat Menangani Perubahan Waktu Proses untuk informasi tentang bagaimana hal ini memengaruhi aplikasi Anda selama waktu proses. Lihat juga bidang konfigurasi |
Metode navigasi non-sentuh utama |
nonav dpad trackball wheel
|
Lihat juga bidang konfigurasi |
Versi Platform (level API) | Contoh:v3 v4 v7 dll. |
Level API yang didukung oleh perangkat. Misalnya, |
Catatan: Sebagian qualifier konfigurasi telah ditambahkan sejak Android 1.0, jadi tidak semua versi Android mendukung semua qualifier. Menggunakan qualifier baru secara implisit akan menambahkan qualifier versi platform sehingga perangkat yang lebih lama pasti mengabaikannya. Misalnya, menggunakan qualifier w600dp
secara otomatis akan menyertakan qualifier v13
, karena qualifier lebar yang tersedia baru di API level 13. Untuk menghindari masalah, selalu sertakan satu set sumber daya default (satu set sumber daya tanpa qualifier). Untuk informasi selengkapnya, lihat bagian tentang Menyediakan Kompatibilitas Perangkat Terbaik dengan Sumber Daya.
Aturan penamaan qualifier
Inilah beberapa aturan tentang penggunaan nama qualifier konfigurasi:
- Anda bisa menetapkan beberapa qualifier untuk satu set sumber daya, yang dipisahkan dengan tanda hubung. Misalnya,
drawable-en-rUS-land
berlaku untuk perangkat bahasa Inggris-AS dalam orientasi lanskap. - Qualifier harus dalam urutan seperti yang tercantum dalam tabel 2. Misalnya:
- Salah:
drawable-hdpi-port/
- Benar:
drawable-port-hdpi/
- Salah:
- Direktori resource alternatif tidak bisa digunakan. Misalnya, Anda tidak bisa memiliki
res/drawable/drawable-en/
. - Nilai tidak membedakan huruf besar maupun kecil. Compiler sumber daya mengubah nama direktori menjadi huruf kecil sebelum pemrosesan untuk menghindari masalah pada sistem file yang membedakan huruf kecil dan besar. Setiap penggunaan huruf besar dalam nama hanyalah demi keterbacaan.
- Hanya didukung satu nilai untuk setiap tipe qualifier. Misalnya, jika Anda ingin menggunakan file sumber daya dapat digambar yang sama dengan bahasa Spanyol dan Prancis, Anda tidak bisa memiliki direktori bernama
drawable-rES-rFR/
. Sebagai gantinya, Anda memerlukan dua direktori sumber daya, sepertidrawable-rES/
dandrawable-rFR/
, yang berisi file yang sesuai. Namun, Anda tidak harus menduplikasi file yang sama di kedua lokasi. Sebagai gantinya, Anda bisa membuat alias ke satu sumber daya. Lihat Membuat sumber daya alias di bawah ini.
Setelah Anda menyimpan sumber daya alternatif ke dalam direktori yang diberi nama dengan qualifier ini, Android secara otomatis menerapkan sumber daya dalam aplikasi Anda berdasarkan pada konfigurasi perangkat saat ini. Setiap kali sumber daya diminta, Android akan memeriksa direktori sumber daya alternatif berisi file sumber daya yang diminta, lalu mencari sumber daya yang paling cocok (dibahas di bawah). Jika tidak ada sumber daya alternatif yang cocok dengan konfigurasi perangkat tertentu, Android akan menggunakan sumber daya default terkait (set sumber daya untuk tipe sumber daya tertentu yang tidak termasuk qualifier konfigurasi).
Membuat sumber daya alias
Bila memiliki sumber daya yang ingin Anda gunakan untuk lebih dari satu konfigurasi perangkat (namun tidak ingin menyediakannya sebagai sumber daya default), Anda tidak perlu menempatkan sumber daya yang sama di lebih dari satu direktori sumber daya alternatif. Sebagai gantinya, (dalam beberapa kasus) Anda bisa membuat sumber daya alternatif yang berfungsi sebagai alias untuk sumber daya yang disimpan dalam direktori sumber daya default.
Catatan: Tidak semua sumber daya menawarkan mekanisme yang memungkinkan Anda membuat alias ke sumber daya lain. Khususnya, sumber daya animasi, menu, mentah, dan sumber daya lain yang tidak ditetapkan dalam direktori xml/
tidak menawarkan fitur ini.
Misalnya, bayangkan Anda memiliki ikon aplikasi, icon.png
, dan membutuhkan versi unik untuk lokal berbeda. Akan tetapi, dua lokal, bahasa Inggris-Kanada dan bahasa Prancis-Kanada, harus menggunakan versi yang sama. Anda mungkin berasumsi bahwa Anda perlu menyalin gambar yang sama ke dalam direktori sumber daya baik untuk bahasa Inggris-Kanada maupun bahasa Prancis-Kanada, namun bukan demikian. Sebagai gantinya, Anda bisa menyimpan gambar yang sama-sama digunakan sebagai icon_ca.png
(nama apa saja selain icon.png
) dan memasukkannya dalam direktori default res/drawable/
. Kemudian buat file icon.xml
dalam res/drawable-en-rCA/
dan res/drawable-fr-rCA/
yang mengacu ke sumber daya icon_ca.png
yang menggunakan elemen <bitmap>
. Hal ini memungkinkan Anda menyimpan satu versi saja dari file PNG dan dua file XML kecil yang menunjuk ke sana. (Contoh file XML ditampilkan di bawah.)
Dapat digambar
Untuk membuat alias ke sumber daya dapat digambar yang ada, gunakan elemen <drawable>
. Sebagai contoh:
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
Jika Anda menyimpan file ini sebagai drawables.xml
(dalam direktori sumber daya alternatif, seperti res/values-en-rCA/
), maka file akan dikompilasi menjadi sumber daya yang bisa Anda referensikan sebagai R.drawable.icon
, namun sebenarnya merupakan alias untuk sumber daya R.drawable.icon_ca
(yang disimpan dalam res/drawable/
).
Layout
Untuk membuat alias ke layout yang ada, gunakan elemen ,<include>
yang ada dalam <merge>
. Sebagai contoh:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
Jika Anda menyimpan file ini sebagai main.xml
, file akan dikompilasi menjadi sumber daya yang bisa Anda referensikan sebagai R.layout.main
, namun sebenarnya merupakan alias untuk sumber daya R.layout.main_ltr
.
String dan nilai-nilai sederhana lainnya
Untuk membuat alias ke string yang ada, cukup gunakan ID sumber daya dari string yang diinginkan sebagai nilai untuk string baru. Sebagai contoh:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
Sumber daya R.string.hi
sekarang merupakan alias untuk R.string.hello
.
Nilai sederhana lainnya cara kerjanya sama. Misalnya, sebuah warna:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
Mengakses sumber daya aplikasi Anda
Setelah menyediakan sumber daya dalam aplikasi Anda, Anda bisa menerapkannya dengan mengacu pada ID sumber dayanya. Semua ID sumber daya didefinisikan di class R
proyek Anda, yang dihasilkan oleh fitur aapt
secara otomatis.
Bila aplikasi Anda telah dikompilasi, aapt
akan menghasilkan class R
, yang berisi ID sumber daya untuk semua sumber daya dalam direktori res/
Anda. Untuk masing-masing tipe sumber daya, ada subclass R
(misalnya, R.drawable
untuk semua sumber daya yang dapat digambar), dan untuk masing-masing sumber daya bertipe itu, ada satu integer statis (misalnya, R.drawable.icon
). Integer ini adalah ID sumber daya yang bisa Anda gunakan untuk mengambil sumber daya.
Walaupun class R
adalah tempat menetapkan ID sumber daya, Anda tidak perlu melihat ke sana untuk menemukan ID sumber daya. ID sumber daya selalu terdiri dari:
- Tipe sumber daya: Masing-masing sumber daya dikelompokkan menjadi "tipe", misalnya
string
,drawable
, danlayout
. Untuk mengetahui selengkapnya tentang berbagai tipe, lihat Tipe Sumber Daya. - Nama sumber daya, bisa berupa: nama file, tidak termasuk ekstensi; atau nilai dalam atribut
android:name
XML, jika sumber daya itu sebuah nilai sederhana (misalnya sebuah string).
Ada dua cara untuk mengakses sumber daya:
- Dalam kode: Menggunakan integer statis dari subclass dari class
R
, misalnya:R.string.hello
string
adalah tipe sumber daya danhello
adalah nama sumber daya. Ada banyak Android API yang bisa mengakses sumber daya Anda bila Anda menyediakan ID sumber daya dengan format ini. Lihat Mengakses Sumber Daya dalam Kode. - Dalam XML: Menggunakan sebuah sintaks XML khusus yang juga berkaitan dengan ID sumber daya yang didefinisikan dalam class
R
, misalnya:@string/hello
string
adalah tipe sumber daya danhello
adalah nama sumber daya. Anda bisa menggunakan sintaks ini dalam sumber daya XML di mana saja Anda ingin menyediakan sebuah nilai dalam sebuah sumber daya. Lihat Mengakses Sumber Daya dari XML.
Mengakses sumber daya dalam kode
Anda bisa menggunakan sumber daya dalam kode dengan menyalurkan ID sumber daya sebagai sebuah parameter metode. Misalnya, Anda bisa menyetel ImageView
agar menggunakan sumber daya res/drawable/myimage.png
dengan menggunakan setImageResource()
:
Kotlin
val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)
Java
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
Anda juga bisa mengambil tiap sumber daya dengan menggunakan berbagai metode di Resources
, di mana Anda bisa mendapatkan instance dengan getResources()
.
Sintaks
Inilah sintaks untuk mengacu sumber daya dalam kode:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>
adalah nama paket yang di dalamnya terdapat sumber daya (tidak dibutuhkan bila mereferensikan sumber daya dari paket Anda sendiri).<resource_type>
adalah subclassR
untuk tipe sumber daya.<resource_name>
bisa berupa nama file sumber daya tanpa ekstensi atau nilai atributandroid:name
dalam elemen XML (untuk nilai sederhana).
Lihat Tipe Sumber Daya untuk informasi selengkapnya tentang masing-masing tipe sumber daya dan cara mengacunya.
Kasus penggunaan
Ada banyak metode yang menerima parameter ID sumber daya dan Anda bisa mengambil sumber daya dengan menggunakan metode di Resources
. Anda bisa mengambil instance Resources
dengan Context.getResources()
.
Berikut adalah beberapa contoh cara mengakses sumber daya dalam kode:
Kotlin
// Load a background for the current screen from a drawable resource window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID window.setTitle(resources.getText(R.string.main_title)) // Load a custom layout for the current screen setContentView(R.layout.main_screen) // Set a slide in animation by getting an Animation from the Resources object flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)
Java
// Load a background for the current screen from a drawable resource getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ; // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID getWindow().setTitle(getResources().getText(R.string.main_title)); // Load a custom layout for the current screen setContentView(R.layout.main_screen); // Set a slide in animation by getting an Animation from the Resources object flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)); // Set the text on a TextView object using a resource ID TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello_message);
Perhatian: Anda tidak boleh memodifikasi R.java
file secara manual—, ini dihasilkan oleh fitur aapt
bila project Anda telah dikompilasi. Perubahan apa pun akan ditimpa bila nanti Anda mengompilasi.
Mengakses sumber daya dari XML
Anda bisa mendefinisikan nilai untuk beberapa atribut dan elemen XML dengan menggunakan acuan ke sumber daya yang ada. Anda akan sering melakukannya saat membuat file layout, untuk memasok string dan gambar bagi widget Anda.
Misalnya, jika Anda menambahkan sebuah Button
ke layout, Anda harus menggunakan sebuah sumber daya string bagi teks tombolnya:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
Sintaks
Berikut adalah sintaks untuk mengacu sumber daya di sumber daya XML:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>
adalah nama paket yang di dalamnya terdapat sumber daya (tidak dibutuhkan bila mereferensikan sumber daya dari paket yang sama)<resource_type>
adalah subclassR
untuk tipe sumber daya<resource_name>
bisa berupa nama file sumber daya tanpa ekstensi atau nilai atributandroid:name
dalam elemen XML (untuk nilai sederhana).
Lihat Tipe Sumber Daya untuk informasi selengkapnya tentang masing-masing tipe sumber daya dan cara mengacunya.
Kasus penggunaan
Dalam beberapa kasus, Anda harus menggunakan sumber daya untuk suatu nilai dalam XML (misalnya, untuk menerapkan gambar yang dapat digambar pada widget), namun Anda juga bisa menggunakan sumber daya di XML mana saja yang menerima nilai sederhana. Misalnya, jika Anda mempunyai file sumber daya berikut yang berisi sumber daya warna dan sumber daya string:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
Anda bisa menggunakan sumber daya ini dalam file layout berikut untuk mengatur warna teks dan string teks:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" />
Dalam hal ini, Anda tidak perlu menyebutkan nama paket dalam sumber daya acuan karena sumber daya berasal dari paket Anda sendiri. Untuk mengacu sumber daya sistem, Anda perlu memasukkan nama paketnya. Sebagai contoh:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@android:color/secondary_text_dark" android:text="@string/hello" />
Catatan: Anda harus menggunakan sumber daya string sepanjang waktu, sehingga aplikasi Anda bisa dilokalkan untuk bahasa lain. Untuk informasi tentang cara membuat sumber daya alternatif (seperti string lokal), lihat Menyediakan sumber daya alternatif. Untuk panduan lengkap melokalkan aplikasi Anda ke bahasa lain, lihat Pelokalan.
Anda bahkan bisa menggunakan sumber daya dalam XML untuk membuat alias. Misalnya, Anda bisa membuat sumber daya dapat digambar yang merupakan alias bagi sumber daya dapat digambar lainnya:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
Hal ini terdengar berlebihan, namun bisa sangat berguna saat menggunakan sumber daya alternatif. Baca selengkapnya tentang Membuat sumber daya alias.
Mengacu atribut gaya
Sumber daya atribut gaya memungkinkan Anda mengacu nilai suatu atribut dalam tema yang diterapkan saat ini. Dengan mengacu sebuah atribut gaya memungkinkan Anda menyesuaikan tampilan elemen UI dengan menata gayanya agar cocok dengan beragam variasi standar yang dipasok oleh tema saat ini, sebagai ganti memasok nilai yang ditanamkan (hard-coded). Mengacu sebuah atribut gaya pada dasarnya adalah "gunakan gaya yang didefinisikan oleh atribut ini, dalam tema saat ini".
Untuk mereferensikan sebuah atribut gaya, sintaks namanya hampir sama dengan format sumber daya normal, namun sebagai ganti simbol (@
), gunakan sebuah tanda tanya (?
), dan bagian tipe sumber daya bersifat opsional. Sebagai contoh:
?[<package_name>:][<resource_type>/]<resource_name>
Misalnya, begini cara Anda mengacu suatu atribut untuk mengatur warna teks agar cocok dengan warna teks "utama" tema sistem:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
Di sini, atribut android:textColor
menetapkan nama atribut gaya dalam tema saat ini. Android kini menggunakan nilai yang diterapkan pada atribut gaya android:textColorSecondary
sebagai nilai untuk android:textColor
dalam widget ini. Karena alat sumber daya mengetahui bahwa atribut sumber daya diharapkan dalam konteks ini, maka Anda tidak perlu menyatakan tipenya secara eksplisit (yang akan berupa ?android:attr/textColorSecondary
)—Anda bisa mengecualikan tipe attr
.
Mengakses file asli
Walaupun tidak lazim, Anda mungkin perlu mengakses file dan direktori asli. Jika demikian, maka menyimpan file Anda di res/
tidak akan berhasil, karena satu-satunya cara untuk membaca sumber daya dari res/
adalah dengan ID sumber daya. Sebagai gantinya, Anda bisa menyimpan sumber daya dalam direktori assets/
.
File yang disimpan di direktori assets/
tidak diberi ID sumber daya, sehingga Anda tidak bisa mereferensikannya melalui class R
atau dari sumber daya XML. Sebagai gantinya, Anda bisa melakukan kueri file di direktori assets/
seperti sebuah sistem file biasa dan membaca data mentah dengan menggunakan AssetManager
.
Akan tetapi, jika yang Anda butuhkan hanya kemampuan membaca data mentah (misalnya sebuah file video atau audio), maka simpanlah file itu di direktori res/raw/
dan baca aliran byte dengan menggunakan openRawResource()
.
Mengakses sumber daya platform
Android berisi sejumlah sumber daya standar, seperti gaya, tema, dan layout. Untuk mengakses semua sumber daya ini, tetapkan acuan sumber daya Anda dengan nama paket android
. Misalnya, Android menyediakan sumber daya layout yang bisa Anda gunakan untuk item daftar dalam ListAdapter
:
Kotlin
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
Java
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
Dalam contoh ini, simple_list_item_1
adalah sumber daya layout yang didefinisikan oleh platform untuk item di ListView
. Anda bisa menggunakannya daripada menciptakan layout sendiri untuk item daftar.
Menyediakan kompatibilitas perangkat terbaik dengan sumber daya
Agar aplikasi Anda mendukung beberapa konfigurasi perangkat, Anda harus selalu menyediakan sumber daya default untuk setiap tipe sumber daya yang digunakan aplikasi Anda.
Misalnya, jika aplikasi Anda mendukung beberapa bahasa, selalu sertakan direktori values/
(tempat string Anda disimpan) tanpa qualifier bahasa dan region. Jika sebaliknya Anda menempatkan semua file string dalam direktori yang memiliki qualifier bahasa dan region, maka aplikasi Anda akan error saat berjalan pada perangkat yang telah diatur ke bahasa yang tidak didukung string Anda. Namun asalkan Anda menyediakan sumber daya default values/
, aplikasi akan berjalan lancar (meskipun pengguna tidak memahami bahasa itu—ini lebih baik daripada error).
Demikian pula, jika Anda menyediakan sumber daya layout berbeda berdasarkan orientasi layar, Anda harus memilih satu orientasi sebagai default. Misalnya, sebagai ganti menyediakan sumber daya layout dalam layout-land/
untuk lanskap dan layout-port/
untuk potret, biarkan salah satu sebagai default, seperti layout/
untuk lanskap dan layout-port/
untuk potret.
Sumber daya default perlu disediakan bukan hanya karena aplikasi mungkin berjalan pada konfigurasi yang belum Anda antisipasi, namun juga karena versi baru Android terkadang menambahkan qualifier konfigurasi yang tidak didukung oleh versi lama. Jika Anda menggunakan qualifier sumber daya baru, namun mempertahankan kompatibilitas kode dengan versi Android yang lebih lama, maka saat versi lama Android menjalankan aplikasi, aplikasi itu akan error jika Anda tidak menyediakan sumber daya default, karena aplikasi tidak bisa menggunakan sumber daya yang dinamai dengan qualifier baru. Misalnya, jika minSdkVersion
disetel ke 4, dan Anda memenuhi syarat semua sumber daya yang dapat digambar dengan menggunakan mode malam (night
atau notnight
, yang ditambahkan di API Level 8), maka perangkat API level 4 tidak bisa mengakses sumber daya yang dapat digambar dan akan error. Dalam hal ini, Anda mungkin ingin notnight
menjadi sumber daya default, jadi Anda harus mengecualikan qualifier itu agar sumber daya yang dapat digambar ada dalam drawable/
atau drawable-night/
.
Jadi, agar bisa menyediakan kompatibilitas perangkat terbaik, sediakan selalu sumber daya default untuk sumber daya yang diperlukan aplikasi Anda untuk berjalan dengan benar. Selanjutnya buatlah sumber daya alternatif untuk konfigurasi perangkat tertentu dengan menggunakan qualifier konfigurasi.
Ada satu pengecualian untuk aturan ini: Jika minSdkVersion
aplikasi adalah 4 atau lebih, Anda tidak memerlukan sumber daya default yang dapat digambar saat menyediakan sumber daya alternatif yang dapat digambar dengan qualifier kepadatan layar. Tanpa sumber daya dapat digambar default sekali pun, Android bisa menemukan yang paling cocok di antara kepadatan layar alternatif dan menskalakan bitmap sesuai kebutuhan. Akan tetapi, demi pengalaman terbaik pada semua jenis perangkat, Anda harus menyediakan sumber daya dapat digambar alternatif untuk ketiga tipe kepadatan.
Cara Android menemukan sumber daya yang paling cocok
Saat Anda meminta sumber daya yang Anda berikan alternatifnya, Android akan memilih sumber daya alternatif yang akan digunakan saat waktu proses, bergantung pada konfigurasi perangkat saat ini. Untuk mendemonstrasikan cara Android memilih sumber daya alternatif, anggaplah direktori sumber daya dapat digambar berikut masing-masing berisi versi berbeda dari gambar yang sama:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
Dan anggaplah yang berikut ini merupakan konfigurasi perangkatnya:
Lokal = en-GB
Orientasi layar = port
Kepadatan piksel layar = hdpi
Tipe layar sentuh = notouch
Metode masukan teks utama = 12key
Dengan membandingkan konfigurasi perangkat dengan sumber daya alternatif yang tersedia, Android akan memilih yang dapat digambar dari drawable-en-port
.
Sistem akan menentukan keputusannya mengenai sumber daya yang akan digunakan dengan logika berikut:

Gambar 2. Bagan alur bagaimana Android menemukan sumber daya yang paling cocok.
- Menghapus file sumber daya yang bertentangan dengan konfigurasi perangkat.
Direktori
drawable-fr-rCA/
dihapus karena bertentangan dengan lokalen-GB
.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Pengecualian: Kepadatan piksel layar adalah satu qualifier yang tidak dihapus karena bertentangan. Meskipun kepadatan layar perangkat adalah hdpi,
drawable-port-ldpi/
tidak dihapus karena setiap kepadatan layar dianggap cocok untuk saat ini. Informasi selengkapnya tersedia dalam dokumen Mendukung Beberapa Layar. - Pilih qualifier prioritas (berikutnya) dalam daftar (tabel 2). (Mulai dengan MCC, lalu pindah ke bawah.)
- Apakah salah satu direktori sumber daya menyertakan qualifier ini?
- Jika Tidak, kembali ke langkah 2 dan lihat qualifier berikutnya. (Dalam contoh, jawabannya adalah "tidak" hingga qualifier bahasa tercapai.)
- Jika Ya, lanjutkan ke langkah 4.
- Hapus direktori sumber daya yang tidak termasuk qualifier ini. Dalam contoh, sistem menghapus semua direktori yang tidak menyertakan qualifier bahasa:
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/Pengecualian: Jika qualifier yang dimaksud adalah kepadatan piksel layar, Android akan memilih opsi yang paling cocok dengan kepadatan layar perangkat. Secara umum, Android kemungkinan akan menurunkan skala gambar asli yang lebih besar daripada menaikkan skala atas gambar asli yang lebih kecil. Lihat Mendukung Beberapa Layar.
- Kembali dan ulangi langkah 2, 3, dan 4 hingga tersisa satu direktori. Dalam contoh ini, orientasi layar adalah qualifier berikutnya yang memiliki kecocokan. Jadi, sumber daya yang tidak menetapkan orientasi layar akan dihapus:
drawable-en/drawable-en-port/drawable-en-notouch-12key/Direktori yang tersisa adalah
drawable-en-port
.
Meskipun prosedur dijalankan untuk setiap sumber daya yang diminta, sistem akan mengoptimalkan beberapa aspek lebih lanjut. Satu optimalisasi tersebut adalah bahwa setelah konfigurasi perangkat diketahui, sistem mungkin akan menghapus sumber daya alternatif yang sama sekali tidak cocok. Misalnya, jika bahasa konfigurasi adalah bahasa Inggris ("en"), maka setiap direktori sumber daya yang memiliki qualifier bahasa akan diatur ke selain bahasa Inggris tidak akan pernah disertakan dalam kumpulan sumber daya yang diperiksa (meskipun direktori sumber daya tanpa qualifier bahasa masih disertakan).
Saat memilih sumber daya berdasarkan qualifier ukuran layar, sistem akan menggunakan sumber daya yang didesain untuk layar yang lebih kecil daripada layar saat ini jika tidak ada sumber daya yang lebih cocok (misalnya, layar ukuran besar akan menggunakan sumber daya layar ukuran normal jika diperlukan). Akan tetapi, jika satu-satunya sumber daya yang tersedia lebih besar daripada layar saat ini, sistem tidak akan menggunakannya dan aplikasi Anda akan error jika tidak ada sumber daya lain yang cocok dengan konfigurasi perangkat (misalnya, jika semua sumber daya layout diberi tag qualifier xlarge
, tetapi perangkat memiliki layar ukuran normal).
Catatan: Prioritas qualifier (dalam tabel 2) lebih penting daripada jumlah qualifier yang benar-benar cocok dengan perangkat. Misalnya, dalam langkah 4 di atas, pilihan terakhir pada daftar berisi tiga qualifier yang benar-benar cocok dengan perangkat (orientasi, tipe layar sentuh, dan metode masukan), sementara drawable-en
hanya memiliki satu parameter yang cocok (bahasa). Akan tetapi, bahasa memiliki prioritas lebih tinggi daripada qualifier lainnya, sehingga drawable-port-notouch-12key
tidak masuk.