# Ch 2. Android dan Model-View-Controller Pada bab ini, kita akan mengupgrade GeoQuiz untuk menampilkan lebih dari satu pertanyaan, seperti terlihat pada Gambar 2.1. ![](https://i.imgur.com/lBGysJK.png) Untuk mewujudkan ini, kita akan menambahkan sebuah class bernama `Question` ke project GeoQuiz. Sebuah instance dari class ini akan mengenkapsulasi pertanyaan true false. Lalu kita akan membuat sebuah array dari object-object `Question` untuk dikelola oleh `QuizActivity`. ## Membuat Class Baru Dalam window tool project, klik-kanan ```java public class Question { private int mTextResId; private boolean mAnswerTrue; public Question(int textResId, boolean answerTrue) { mTextResId = textResId; mAnswerTrue = answerTrue; } } ``` Class `Question` menyimpan dua buah data: teks pertanyaan dan jawaban pertanyaan (treu atau false). Kenapa `mTextResId` bertipe `int` bukan `String`? Ini karena variabel `mTextResId` digunakan untuk menyimpan ID resource (selalu `int`) dari sebuah resource string untuk pertanyaan. Anda akan membuat resource string pertanyaan pada bagian berikutnya. Variabel-variabel ini memerlukan method-method getter dan setter. Ketimbang menuliskannya sendiri, kita dapat mengatur Android Studio untuk melakukannya untuk kita. ### Menggenerasi Getter dan Setter Langkah pertama adalah untuk mengkonfigurasi Android Studio untuk mengenal prefix `m` untuk variabel member. Buka preferensi Android Studio (`File` --> `Setting`). Expansi `Editor` dan lalu expansi `Code Style`. Pilih `Java`, lalu pilih tab `Code Generation`. Pada tabel `Naming`, pilih baris `Field` dan tambahkan `m` sebagai nama prefix untuk field-field. Lalu tambahkan `s` sebagai nama prefix untuk field static. (Anda tidak akan menggunakan prefix `s` dalam project GeoQUiz, tetapi ini akan berguna nanti di project lain.) ![](https://i.imgur.com/JAhXax5.png) Apa tujuan dari mengatur prefix-prefix ini? Sekarang, ketika kita meminta Android Studio untuk menggenerasi sebuah getter dari `mTextResId`, ia akan membuat `getTextResId()` dibaandingkan `getMTextResId()` dan `isAnswerTrue()` dibandingkan `isMAnswerTrue()`. Kembali dalam `Question.java`, klik kanan setelah constructor dan pilih `Generate...` dan lalu `Getter and Setter`. PIlih `mTextResId` dan `mAnswerTrue` dan clik `OK` ## Model-View-Controller dan Android Perhatikan bahwa object-object pada Gambar 2.4 dibagi menjadi tiga bagian yang dilabeli Model, Controller, dan View. Aplikasi Android didesain sekitar arsitektur yang disebut dengan model-View-Controller, atau MVC. Dalam MVC, semua object dalam apliasi Anda harus berupa sebuah `object model`, `object view`, dan `object conntroller`. - `model object` menyimpan data aplikasi dan "logika bisnis". Class Model umumnya didesain untuk memodelkan hal-hal yang aplikasi Anda perdulikan, seperti pengguna, sproduk dalam toko, foto pada server, tv show, atau pertanyaan true flase. Object model tidak mempunyai pengetahuan mengenai UI. Tujuan tunggal nya adalah menyimpan dan mengelola data. Dalam aplikasi Android, class-class model umumnya adalah class-class custom yang kita buat sendiri. Semua object-object model dalam apalikasi kita membentuk model layer. Model layer dari GeoQuiz teridri dari class `Question`. - `view object` mengetahui bagaimana menggambar dirinya senddiri pada layar dan bagaimana meresepon input user, seperti sentuhan. Aturan jempol sederhana adalah jika kita dapat melihatnya pada layar makan itu adalah view. Android menyediakan banyak sekali class-class view yang konfigureable. Anda dapat juga membuat class view custom. Object view aplikasi membutk layer view. Layer view GeoQuiz terdiri dari widget-widget yang dikembungkan dari `activity_quiz.xml`. - `object controller` menghubungkan view dan model object. Mereka berisi logika aplikasi. Controller didesain untuk merespon berbagai event-event yang ditrigger oleh object view dan untuk mengelola flow data dari dan ke object model dan layer view. Dalam Android, sebuah controller umumnya adalah subclass dari `Activity`, `Fragment`, atau `Service`. Geoquiz layer controller, saat ini, terdiri hanya `QuizActivity`. Gambar 2.5 menunjukkan alur kontrol antara object-object dalam respon ke event user, seperti pemencetan tombol. Perhatikan bahwa object model dan view tidak berbicara satu sama lain; controller duduk rapih di antara semuanya, menerima pesan-pesan dari object dan memanggil instruksi ke yang lain. ![](https://i.imgur.com/QYMZdkw.png) ## Keuntungan MVC Sebuah aplikasi dapat mengakumulasikan fitur-fitur sampai terlalu rumit untuk dipahami.