Memahami App Resource di Android

Bagus Aji Santoso 10 Agustus 2017

Memahami App Resource di Android

Di Android, hampir semuanya adalah sebuah resource. Mendefinisikan resource yang nantinya dapat diakses di aplikasi merupakan bagian mendasar dari proses pengembangan aplikasi Android.

Resource dapat dipakai untuk mendefinisikan color (warna), image (gambar), layout (tata letak), menu, dan nilai string. Nilai-nilai di dalam resource ini mencegah kita dari menuliskannya secara langsung (hardcoded). Semua yang didefinisikan dapat dipanggil dari manapun didalam project yang dibuat. Contoh yang paling umum dan paling sederhana adalah penggunaan string resource untuk lokalisasi teks yang fleksibel.

Jenis-jenis Resource

Berikut ini jenis resource yang paling umum dipakai di aplikasi Android:

NamaFolderDeskripsi
Property Animationanimatorberkas XML yang mendefinisikan properti animasi
Tween Animationanimberkas XML yang mendefinisikan tween animasi
Drawabledrawableberkas gambar berbentuk Bitmap atau XML
Layoutlayoutberkas XML yang mendefinisikan antarmuka aplikasi
Menumenuberkas XML yang mendefinisikan menu atau item action bar
Valuesvaluesberkas XML yang menyimpan nilai seperti string, integer, dan color.

Di bawah ini merupakan berkas-berkas yang tersimpan di folder values:

NamaFileDeskripsi
Colorres/values/colors.xmlMendefinisikan warna
Dimensionsres/values/dimens.xmlMendefinisikan ukuran seperti padding, margin, font, dll.
Stringsres/values/strings.xmlMendefinisikan teks misalnya untuk placeholder atau nama aplikasi
Stylesres/values/styles.xmlMendefinisikan style misalnya warna untuk AppBar

Untuk daftar jenis resource yang lebih lengkap, silahkan kunjungi halaman berikut.

Membuat App Resource

Membuat Sebuah String Resource

Untuk setiap teks yang ingin ditampilkan di aplikasi (misalnya label sebuah Button dan teks didalam TextView), kita pertama harus mendefinisikan dulu teks tersebut di dalam berkas /res/avlues/strings.xml. Setiap nilai yang ditambahkan di dalam berkas tersebut terdiri atas key (sebagai id untuk teks) dan nilai dari teks itu sendiri. Contoh, apabila kita ingin membuat sebuah Button dengan teks "Submit", berikut ini nilai yang mesti ditambahkan ke strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello!</string>
    <string name="submit_label">Submit</string>
</resources>

Sekarang kapanpun kita memanggil id submit_label, kita akan mendapatkan teks "Submit". Kita dapat menampilkan data yang lebih kompleks (misalnya teks yang mengandung kode html atau karakter khusus) menggunakan CDATA sebagai berikut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="feedback_label">
  <![CDATA[
    Please <a href="http://highlight.com">let us know</a> if you have feedback on this or if 
    you would like to log in with another identity service. Thanks! This is a longer string!  
  ]]>
  </string>
</resources>

Mereferensikan App Resource

Sekarang setelah kita mendefinisikan string resource yang dibutuhkan, kita dapat memanggilnya dari Java atau XML lain. Untuk mengaksesnya dari file XML lain, cukup panggil menggunakan simbol @:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit_label" />

Untuk mengakses resource ini dari Java, maka kita perlu memanggil metode getResource.getString atau getString dengan memanggil id-nya:

String submitText = getResources().getString(R.string.submit_label)

Pola yang sama dapat kita pakai untuk memanggil semua jenis resource.

Mendefinisikan Color Resource

Selain string resource seperti contoh di atas, kita juga dapat membuat color resource sebagai berikut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="white">#FFFFFF</color>
   <color name="yellow">#FFFF00</color>
   <color name="fuchsia">#FF00FF</color>
</resources>

Mengaksesnya di kode Java dengan cara sebagai berikut:

// cara pemanggilan getResources().getColor() sudah ditinggalkan
// Resources res = getResources();
// int color = res.getColor(R.color.yellow); 

// Gunakan ContextCompatResources untuk menggantikan getColor()
int color = ContextCompat.getColor(context, R.color.yellow);

Dan memanggilkan color resource dari berkas XML lain dengan cara:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/fuchsia"
    android:text="Hello"/>

Mendefinisikan Dimension Resource

Saat menentukan ukuran kita menggunakan beberapa unit misalnya 16dp untuk ukuran margin dan 12sp untuk ukuran font. Dimensi ini mesti kita definisikan di berkas dimens.xml dengan cara:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textview_height">25dp</dimen>
    <dimen name="textview_width">150dp</dimen>
    <dimen name="ball_radius">30dp</dimen>
    <dimen name="font_size">16sp</dimen>
</resources>

Pemanggilannya di Java:

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);

Sedangkan di XML:

<TextView
    android:layout_height="@dimen/textview_height"
    android:layout_width="@dimen/textview_width"
    android:textSize="@dimen/font_size"/>

Pemanggilan Resource Secara Dinamis

Dalam beberapa kasus kita ingin mengambil resource secara dinamis tanpa menuliskan manual id-nya. Contoh, kita ingin mengambil teks dari "submit_label" berdasarkan namanya. Nilai yang diinginkan bisa kita dapatkan menggunakan metode getIdentifier di dalam sebuah Activity:

public String getStringValue(String key) {
    // Mengambil resource id
    String packageName = getBaseContext().getPackageName();
    Resources resources = getBaseContext().getResources();
    int stringId = resources.getIdentifier(key, "string", packageName);
    if (stringId == 0) { return null; }
    // Mengembalikan nilai string berdasarkan resource id
    return resources.getString(stringId);
}

Sekarang kita bisa mereferensikan string resource secara dinamis dengan cara:

public String myKey = "submit_label"; // Maksudnya R.string.submit_label
public String myStringValue = getStringValue(myKey); // Mengambil teks berdasarkan id

Teknik di atas dapat diaplikasikan ke jenis resource yang lain. Berikut ini contoh untuk mengambil view secara dinamis berdasarkan id-nya:

// getViewById("tvTest");
public View getViewById(String id) {
    // Retrieve the resource id
    String packageName = getBaseContext().getPackageName();
    Resources resources = getBaseContext().getResources();
    int viewId = resources.getIdentifier(id, "id", packageName);
    if (viewId == 0) { return null; }
    return findViewById(viewId);
}

Membuat Resource Alternatif

Responsive Design

Untuk membuat antarmuka yang menarik, penting bagi developer membuat aplikasi yang ia kembangkan dapat berjalan dengan baik di berbagai peragnkat. Untuk mencapai tujuan ini, kita pertama harus membagi jenis-jenis perangkat Android kedalam kategori berdasarkan besar layar sebagai berikut:

Image

Aplikasi harus didesain untuk berkerja di berbagai jenis lebar layar dan kerapatannya.

Menyediakan Resource Alternatif

Salah satu fitur paling powerful yang dapat dipakai developer adalah membuat resource alternatif berdasarkan ukuran layar, bahasa, kerapatan layar, dll. Beberapa penggunaannya yang paling umum adalah:

  • Membuat layout yang berbeda untuk jenis perangkat yang berbeda (misalnya telepon vs tablet)
  • Membuat resource String yang berbeda untuk bahasa yang berbeda (misal Bahasa Inggris vs Italia)
  • Membuat resource drawable untuk kerapatan layar yang berbeda (lihat di bawah)
  • Membuat style yang berbeda untuk sistem yang berbeda (Holo vs Material)
  • Membuat layout yang berbeda untuk orientasi layar yang berbeda (portrait vs landscape)

Untuk mengkhususkan suatu resource alternatif, kita membuat direktori baru di dalam res dengan struktur [resource]-[qualifier]. Qualifier adalah target yang ingin dikenai oleh resource alternatif.

Contoh, bila ingin memastikan semua gambar dapat tersedia untuk segala jenis kerapatan layar dapat kita lakukan dengan membuat direktori res/drawable-hdpi, res/drawable-xhdpi, dan res/drawable-xxhdpi lalu mengisinya dengan gambar yang sama namun memiliki dimensi yang berbeda. Android akan memilih resource mana yang paling cocok untuk dipakai berdasarkan kerapatan layar perangkat yang sedang membuatnya. Struktur direktorinya dapat terlihat seperti berikut:

res/
    drawable/   
        icon.png
        background.png    
    drawable-hdpi/  
        icon.png
        background.png
Image

Perlu dicatat bahwa resource harus memiliki nama yang sama meski berada di folder yang berbeda.

Resource Qualifiers

Android memiliki beberapa jenis qualifier yang berguna untuk menentukan resource mana yang harus digunakan pada perangkat tertentu. Qualifier yang paling umum dipakai adalah:

Jenis KonfigurasiQualifierDeskripsi
Bahasaen, id, frKode bahasa
Ukuran Layarsw480dp, sw600dpUkuran minimum layar (tinggi atau lebar)
Orientasi Layarport, landMenentukan apakah layar berada di mode portrait atau landscape
Kerapatan Layarhdpi, xhdpiKerapatan layar biasanya dipakai untuk gambar
Versi Platformv7, v11, v21Dipakai biasanya untuk style

Kita dapat memberikan beberapa qualifier untuk satu jenis resource yang dipisahkan dengan tanda -. Contoh, drawable-en-sw600dp-ladn akan mengaplikasikan resource pada perangkat tablet yang menggunakan Bahasa Inggris dengan ukuran layar minimal 600dp di orientasi landscape. Perlu dicatat bila menggunakan multiple qualifier untuk satu jenis resource, kita harus menambahkannya didirektori dalam urutan yang benar. Kunjungi halaman berikut untuk melihat seluruh qualifier yang tersedia.

Membuat Resource Alternatif

Di Android Studio, cara termudah untuk membuat resource alternatif adalah dengan melakukan klik kanan pada sebuah subfolder resource (misal, layout) lalu pilih New > Layout resource file untuk mendapatkan jendela baru dan menentukan qualifier yang diinginkan.

Image

Proses di atas akan membuat dua versi layout, satu untuk mode portrait dan satu lagi untuk mode landscape. Jika kita menambahkan label yang berbeda untuk layout yang kedua, kita akan melihat bahwa label tersebut secara otomatis tampil saat layar diputar.

Image

Membaca Konfigurasi Qualifier Saat Runtime

Saat aplikasi sedang berjalan, kita dapat selalu memeriksa konfigurasi yang sedang berjalan (orientasi layar, ukuran layar, dll.) dengan mengakses objek Configuration melalui getResources().getConfiguration() di dalam sebuah Activity atau objek Context. Contoh, untuk membaca orientasi layar saat di dalam Activity, kita dapat melakukannya dengan cara:

String image; int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_PORTRAIT) { image = "image_portrait.png"; // ... } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) { image = "image_landscape.png"; // ... }

Kita juga dapat menjalankan perintah getContext().getResources().getConfiguration() jika tidak berada di dalam sebuah Activity namun memiliki objek Context.

Membuat Layout Alternatif

Penyediaan layout alternatif biasanya dilakukan untuk membuat layout yang berbeda saat aplikasi dijalankan di perangkat handphone atau tablet. Penentuan ukuran ini dapat dilakukan dengan menggunakan smallest width qualifier atau sw. Struktur foldernya dapat terlihat sebagai berikut:

res/
    layout/   
        activity_main.xml
        item_photo.xml    
    layout-sw600dp/ 
        activity_main.xml
    layout-sw600dp-land/
        activity_main.xml 
    layout-sw720dp/ 
        activity_main.xml
        item_photo.xml
    layout-land/
        activity_main.xml
        item_photo.xml

Secara umum perangkat handphone dan phablet berada antara sw240 sampai sw480. Tablet berlayar 7" berlayarsw600 dan tablet berlayar 10" berukuran sw720. Berikut ilustrasinya:

Image

Sumber:

Codepath