Membuat Class Tampilan

Tampilan kustom yang didesain dengan baik sama pentingnya dengan semua class lain yang didesain dengan baik. Desain yang baik ini mencakup serangkaian fungsionalitas tertentu dengan antarmuka yang mudah digunakan, penggunaan CPU dan memori secara efisien, dan sebagainya. Selain menjadi class yang dirancang dengan baik, tampilan kustom harus:

  • Sesuai dengan standar Android
  • Memberikan atribut kustom yang dapat ditata yang berfungsi dengan tata letak XML Android
  • Mengirim peristiwa aksesibilitas
  • Kompatibel dengan berbagai platform Android.

Framework Android menyediakan serangkaian class dasar dan tag XML untuk membantu Anda membuat tampilan yang memenuhi semua persyaratan ini. Pelajaran ini membahas cara menggunakan framework Android untuk membuat fungsionalitas inti untuk sebuah class tampilan.

Selain dalam pelajaran ini, Anda dapat menemukan informasi tambahan yang terkait di bagian Komponen Kustom.

Menyediakan Subclass Tampilan

Semua class tampilan yang ditentukan dalam framework Android menyediakan View. Tampilan kustom juga dapat menyediakan View secara langsung, atau Anda dapat menghemat waktu dengan menyediakan salah satu subclass tampilan yang ada, seperti Button.

Agar Android Studio dapat berinteraksi dengan tampilan Anda, setidak-tidaknya Anda harus menyediakan konstruktor yang menggunakan objek Context dan AttributeSet sebagai parameter. Konstruktor ini memungkinkan layout editor untuk membuat dan mengedit instance tampilan Anda.

Kotlin

    class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
    

Java

    class PieChart extends View {
        public PieChart(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    }
    

Menentukan Atribut Kustom

Untuk menambahkan View bawaan ke antarmuka pengguna, Anda harus menentukannya dalam elemen XML dan mengontrol tampilan dan perilakunya dengan atribut elemen. Tampilan kustom yang ditulis dengan baik juga dapat ditambahkan dan ditata melalui XML. Untuk mengaktifkan perilaku ini pada tampilan kustom, Anda harus:

  • Menetapkan atribut khusus untuk tampilan Anda dalam elemen resource <declare-styleable>
  • Menentukan nilai atribut dalam tata letak XML Anda
  • Mengambil nilai atribut saat runtime
  • Menerapkan nilai atribut yang diambil ke tampilan Anda

Bagian ini membahas cara menentukan atribut kustom dan menentukan nilainya. Bagian selanjutnya membahas cara mengambil dan menerapkan nilai tersebut pada waktu proses.

Untuk menentukan atribut kustom, tambahkan resource <declare-styleable> ke project Anda. Biasanya resource ini ditempatkan dalam file res/values/attrs.xml. Berikut adalah contoh dari file attrs.xml:

    <resources>
       <declare-styleable name="PieChart">
           <attr name="showText" format="boolean" />
           <attr name="labelPosition" format="enum">
               <enum name="left" value="0"/>
               <enum name="right" value="1"/>
           </attr>
       </declare-styleable>
    </resources>
    

Kode ini mendeklarasikan dua atribut kustom, showText dan labelPosition, yang termasuk dalam entity yang dapat ditata bernama PieChart. Nama entity yang dapat ditata ini, menurut konvensi, sama dengan nama class yang menentukan tampilan kustom. Meskipun tidak sepenuhnya perlu untuk mengikuti konvensi ini, banyak editor kode populer yang bergantung pada konvensi penamaan ini untuk memberikan penyelesaian pernyataan.

Setelah menentukan atribut kustom, Anda dapat menggunakannya dalam file XML tata letak seperti atribut bawaan. Satu-satunya perbedaan adalah atribut kustom Anda termasuk dalam namespace berbeda. Bukannya termasuk dalam namespace http://schemas.android.com/apk/res/android, atribut kustom tersebut termasuk dalam http://schemas.android.com/apk/res/[your package name]. Misalnya, berikut adalah cara menggunakan atribut yang ditentukan untuk PieChart:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">
     <com.example.customviews.charting.PieChart
         custom:showText="true"
         custom:labelPosition="left" />
    </LinearLayout>
    

Untuk menghindari keharusan mengulang URI namespace yang panjang, contoh di atas menggunakan perintah xmlns. Perintah ini menetapkan custom alias ke http://schemas.android.com/apk/res/com.example.customviews namespace. Anda dapat memilih alias mana pun yang diinginkan untuk namespace Anda.

Perhatikan nama tag XML yang menambahkan tampilan kustom ke tata letak. Ini adalah nama yang sepenuhnya memenuhi syarat untuk class tampilan kustom. Jika class tampilan Anda merupakan class dalam, Anda harus mengkualifikasinya lebih lanjut dengan nama class luar tampilan. Misalnya, class PieChart memiliki class dalam bernama PieView. Untuk menggunakan atribut kustom dari class ini, Anda harus menggunakan tag com.example.customviews.charting.PieChart$PieView.

Menerapkan Atribut Kustom

Jika tampilan dibuat dari tata letak XML, semua atribut dalam tag XML akan dibaca dari paket resource dan diteruskan ke konstruktor tampilan sebagai AttributeSet. Meskipun dimungkinkan untuk membaca nilai dari AttributeSet secara langsung, melakukannya akan memiliki beberapa kelemahan:

  • Referensi resource dalam nilai atribut tidak ditetapkan
  • Gaya tidak diterapkan

Sebagai gantinya, teruskan AttributeSet ke obtainStyledAttributes(). Metode ini mengembalikan array TypedArray untuk nilai yang telah ditata dan dibatalkan referensinya.

Compiler resource Android melakukan banyak hal untuk memudahkan Anda membuat panggilan obtainStyledAttributes(). Untuk setiap resource <declare-styleable> dalam direktori res, R.java yang dihasilkan menentukan array ID atribut dan seperangkat konstanta yang menentukan indeks untuk setiap atribut dalam array. Gunakan konstanta yang telah ditentukan ini untuk membaca atribut dari TypedArray. Contoh di bawah menunjukkan cara class PieChart membaca atributnya:

Kotlin

    init {
        context.theme.obtainStyledAttributes(
                attrs,
                R.styleable.PieChart,
                0, 0).apply {

            try {
                mShowText = getBoolean(R.styleable.PieChart_showText, false)
                textPos = getInteger(R.styleable.PieChart_labelPosition, 0)
            } finally {
                recycle()
            }
        }
    }
    

Java

    public PieChart(Context context, AttributeSet attrs) {
       super(context, attrs);
       TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs,
            R.styleable.PieChart,
            0, 0);

       try {
           mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
           textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
       } finally {
           a.recycle();
       }
    }
    

Perhatikan bahwa objek TypedArray adalah resource bersama dan harus didaur ulang setelah digunakan.

Menambahkan Properti dan Peristiwa

Atribut adalah cara efektif untuk mengontrol perilaku dan gaya tampilan, tetapi atribut hanya dapat dibaca jika tampilan diinisialisasi. Untuk memberikan perilaku yang dinamis, tampakkan pasangan pengambil dan penyetel properti untuk setiap atribut kustom. Cuplikan berikut menunjukkan cara PieChart memperlihatkan properti yang disebut showText:

Kotlin

    fun isShowText(): Boolean {
        return mShowText
    }

    fun setShowText(showText: Boolean) {
        mShowText = showText
        invalidate()
        requestLayout()
    }
    

Java

    public boolean isShowText() {
       return mShowText;
    }

    public void setShowText(boolean showText) {
       mShowText = showText;
       invalidate();
       requestLayout();
    }
    

Perhatikan bahwa setShowText memanggil invalidate() dan requestLayout(). Panggilan ini sangat penting untuk memastikan keandalan perilaku tampilan. Anda harus membatalkan tampilan setelah adanya perubahan pada propertinya yang dapat mengubah gayanya, sehingga sistem tahu bahwa tampilan perlu digambar ulang. Demikian juga, Anda perlu meminta tata letak baru jika properti berubah yang dapat memengaruhi ukuran atau bentuk tampilan. Melupakan panggilan metode ini dapat menyebabkan bug yang sulit ditemukan.

Tampilan kustom juga harus mendukung pemroses peristiwa untuk mengomunikasikan peristiwa penting. Misalnya, PieChart menampilkan peristiwa khusus yang disebut OnCurrentItemChanged untuk memberi tahu pemroses bahwa pengguna telah memutar diagram lingkaran untuk berfokus pada irisan lingkaran baru.

Properti dan peristiwa sering lupa ditampakkan, terutama jika Anda adalah satu-satunya pengguna tampilan kustom. Tetapi dengan meluangkan waktu untuk menentukan antarmuka tampilan secara cermat, Anda akan bisa mengurangi biaya perawatan di masa depan. Aturan yang perlu diikuti adalah selalu tampakkan properti apa pun yang memengaruhi gaya atau perilaku yang terlihat untuk tampilan kustom Anda.

Mendesain untuk Aksesibilitas

Tampilan kustom Anda harus mendukung berbagai jenis pengguna, termasuk pengguna difabel yang tidak bisa melihat atau menggunakan layar sentuh. Untuk mendukung pengguna difabel, Anda harus:

  • Melabeli kolom masukan menggunakan atribut android:contentDescription
  • Mengirim peristiwa aksesibilitas dengan memanggil sendAccessibilityEvent() jika diperlukan.
  • Mendukung pengontrol alternatif, seperti D-pad dan trackball

Untuk informasi selengkapnya cara membuat tampilan yang dapat diakses, lihat Menjadikan Aplikasi Mudah Diakses di Panduan Developer Android.