1. Sebelum memulai
Dalam codelab ini, Anda akan membuat tata letak untuk aplikasi dasar kalkulator tip. Di akhir codelab, aplikasi yang Anda buat akan memiliki UI yang berfungsi, tetapi belum benar-benar menghitung tip. Membuat aplikasi berjalan dan terlihat lebih profesional akan dibahas dalam codelab berikut.
Prasyarat
- Dapat membuat dan menjalankan aplikasi Android dari template di Android Studio
Yang akan Anda pelajari
- Cara membaca dan menulis tata letak XML di Android
- Cara membuat tata letak untuk formulir sederhana yang akan mengambil input teks dan pilihan pengguna
Yang akan Anda build
- UI untuk aplikasi Android kalkulator tip
Yang Anda perlukan
- Komputer yang diinstal Android Studio versi stabil terbaru
- Koneksi internet untuk mengakses dokumentasi developer Android
2. Memulai project
Lihat kalkulator tip di Google: https://www.google.com/search?q=tip+calculator
Dalam kursus ini, Anda akan mem-build kalkulator tip versi sederhana sebagai aplikasi Android.
Developer sering kali akan menggunakan cara ini—menyiapkan aplikasi versi sederhana dan berfungsi sebagian (meskipun terlihat tidak bagus), kemudian membuatnya berfungsi sepenuhnya dan ditingkatkan secara visual nanti.
Di akhir codelab ini, aplikasi kalkulator tip Anda akan terlihat seperti ini:
Anda akan menggunakan elemen UI yang telah disediakan oleh Android:
EditText
- untuk memasukkan dan mengedit teksTextView
- untuk menampilkan teks, seperti pertanyaan layanan dan jumlah tipRadioButton
- tombol pilihan yang dapat dipilih untuk setiap opsi tipRadioGroup
- untuk mengelompokkan opsi tombol pilihanSwitch
- tombol pengalih aktif/nonaktif untuk memilih apakah akan membulatkan tip atau tidak
Membuat project Empty Activity
- Untuk memulai, buat project Kotlin baru di Android Studio menggunakan template Empty Activity.
- Sebut aplikasinya "Tip Time" dengan API level minimum 19 (KitKat). Nama paket untuk aplikasi ini adalah com.example.tiptime.
- Klik Finish untuk membuat aplikasi.
3. Membaca dan memahami XML
Daripada menggunakan Layout Editor yang sudah biasa Anda gunakan, Anda akan mem-build tata letak aplikasi dengan memodifikasi XML yang menjelaskan UI. Sebagai seorang developer Android, penting bagi Anda untuk mempelajari cara memahami dan mengubah tata letak UI menggunakan XML.
Anda akan melihat, dan mengedit file XML yang mendefinisikan tata letak UI untuk aplikasi ini. XML adalah singkatan dari eXtensible Markup Language yang merupakan cara menggambarkan data menggunakan dokumen berbasis teks. XML memiliki karakteristik dapat diperluas dan sangat fleksibel sehingga banyak digunakan untuk berbagai hal, seperti mendefinisikan tata letak UI aplikasi Android. Anda mungkin dapat mengingat dari codelab sebelumnya bahwa resource lain seperti string untuk aplikasi Anda juga ditentukan dalam file XML yang disebut strings.xml
.
UI untuk aplikasi Android di-build sebagai hierarki containment komponen (widget) dan tata letak komponen di layar. Perhatikan bahwa tata letak itu sendiri adalah komponen UI.
Anda akan menjelaskan hierarki tampilan elemen UI di layar. Misalnya, ConstraintLayout
(induk) dapat berisi Buttons
, TextViews
, ImageViews
, atau tampilan lain (turunan). Ingat, ConstraintLayout
adalah subclass dari ViewGroup
. Ini memungkinkan Anda menentukan posisi atau ukuran tampilan turunan dengan cara yang fleksibel.
Hierarki containment aplikasi Android
Setiap elemen UI diwakili oleh elemen XML di file XML. Setiap elemen dimulai dan diakhiri dengan tag, dan setiap tag diawali dengan <
dan diakhiri dengan >
. Seperti Anda yang dapat menyetel atribut pada elemen UI menggunakan Layout Editor (desain), elemen XML juga dapat memiliki berbagai atribut. Sederhananya, XML untuk elemen UI di atas mungkin seperti ini:
<ConstraintLayout>
<TextView
text="Hello World!">
</TextView>
</ConstraintLayout>
Mari lihat satu contoh spesifik.
- Buka
activity_main.xml
(res > layout > activity_main.xml). - Anda mungkin melihat aplikasi menampilkan
TextView
bertuliskan "Hello World!" dalamConstraintLayout
, seperti yang telah Anda lihat di project sebelumnya yang dibuat dari template ini.
- Temukan opsi untuk tampilan Code, Split, dan Design di kanan atas Layout Editor.
- Pilih tampilan Code.
Seperti inilah tampilan XML di activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Akan ada lebih banyak daripada yang ada di dalam contoh yang disederhanakan, tetapi Android Studio melakukan beberapa hal untuk mempermudah pembacaan XML, seperti halnya kode Kotlin Anda.
- Perhatikan indentasinya. Android Studio melakukan hal ini secara otomatis untuk menunjukkan hierarki elemen.
TextView
diindentasi karena terdapat dalamConstraintLayout
.ConstraintLayout
adalah induk, danTextView
adalah turunan. Atribut setiap elemen diindentasi untuk menunjukkan bahwa atribut itu merupakan bagian dari elemen tersebut. - Perhatikan coding warna—beberapa berwarna biru, sebagian berwarna hijau, dan sebagainya. Bagian file yang serupa digambar dengan warna yang sama untuk membantu Anda mencocokkannya. Secara khusus, perhatikan bahwa Android Studio menggambar awal dan akhir tag elemen dalam warna yang sama. (Catatan: warna yang digunakan di codelab mungkin tidak cocok dengan yang Anda lihat di Android Studio.)
Tag, elemen, dan atribut XML
Berikut adalah versi sederhana elemen TextView
sehingga Anda dapat melihat beberapa bagian penting:
<TextView
android:text="Hello World!"
/>
Baris yang berisi <TextView
merupakan awal tag, dan baris yang berisi />
merupakan akhir tag. Baris yang berisi android:text="Hello World!"
merupakan atribut tag. Baris ini mewakili teks yang akan ditampilkan oleh TextView
. Ketiga baris ini adalah singkatan yang umum digunakan yang disebut tag elemen kosong. Tidak akan ada bedanya jika Anda menulisnya dengan start-tag dan end-tag terpisah, seperti ini:
<TextView
android:text="Hello World!"
></TextView>
Tag elemen kosong juga biasa digunakan untuk menulis sesedikit mungkin baris dan menggabungkan akhir tag dengan baris sebelumnya. Jadi, Anda mungkin melihat tag elemen kosong di dua baris (atau bahkan satu baris jika tidak memiliki atribut):
<!-- with attributes, two lines -->
<TextView
android:text="Hello World!" />
Elemen ConstraintLayout
ditulis dengan tag awal dan tag akhir yang terpisah karena harus dapat menampung elemen lain di dalamnya. Berikut adalah versi sederhana elemen ConstraintLayout
dengan elemen TextView
di dalamnya:
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:text="Hello World!" />
</androidx.constraintlayout.widget.ConstraintLayout>
Jika Anda ingin menambahkan View
lain sebagai turunan dari ConstraintLayout
, seperti Button
di bawah TextView
, posisinya akan berada setelah akhir tag TextView
/>
dan sebelum tag akhir ConstraintLayout
, seperti ini:
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:text="Hello World!" />
<Button
android:text="Calculate" />
</androidx.constraintlayout.widget.ConstraintLayout>
Selengkapnya tentang XML untuk tata letak
- Lihat tag untuk
ConstraintLayout
, dan perhatikan bahwa tag itu menyebutkanandroidx.constraintlayout.widget.ConstraintLayout
, bukan hanyaConstraintLayout
sepertiTextView
. Ini karenaConstraintLayout
adalah bagian dari Android Jetpack yang berisi library kode yang menawarkan fungsi tambahan selain platform Android inti. Jetpack memiliki fungsi penting yang bisa Anda manfaatkan untuk mempermudah pembuatan aplikasi. Anda akan mengenali bahwa komponen UI ini merupakan bagian dari Jetpack karena dimulai dengan kata "androidx". - Anda mungkin telah melihat baris yang diawali dengan
xmlns:
, diikuti denganandroid
,app
, dantools
.
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns
adalah singkatan dari namespace XML, dan setiap baris mendefinisikan skema atau kosakata untuk atribut yang terkait dengan kata-kata tersebut. Namespace android:
, misalnya, menandai atribut yang ditentukan oleh sistem Android. Semua atribut dalam XML tata letak dimulai dengan salah satu namespace tersebut.
- Spasi kosong antar-elemen XML tidak mengubah artinya di komputer, tetapi dapat mempermudah orang dalam membaca XML.
Android Studio secara otomatis akan menambahkan beberapa spasi kosong dan indentasi untuk meningkatkan keterbacaan. Anda nantinya akan mempelajari cara Android Studio memastikan XML mengikuti konvensi gaya coding.
- Anda bisa menambahkan komentar ke XML, seperti yang akan Anda lakukan dengan kode Kotlin. Mulai dengan
<!--
dan akhiri dengan-->
.
<!-- this is a comment in XML -->
<!-- this is a
multi-line
Comment.
And another
Multi-line comment -->
- Perhatikan baris pertama file:
<?xml version="1.0" encoding="utf-8"?>
Baris pertama tersebut menunjukkan bahwa jenis file ini adalah XML, tetapi tidak semua file XML menyertakannya.
4. Membuat tata letak dalam XML
- Masih di
activity_main.xml
, beralihlah ke tampilan layar Split untuk melihat XML di samping Design Editor. Dengan Design Editor, Anda dapat melihat pratinjau tata letak UI.
- Tampilan yang akan digunakan disesuaikan dengan preferensi pribadi Anda. Tetapi untuk codelab ini, gunakan tampilan Split sehingga Anda dapat melihat XML yang diedit beserta perubahannya di Design Editor.
- Coba klik baris yang berbeda, satu di bawah
ConstraintLayout
, lalu satu di bawahTextView
, dan perhatikan bahwa tampilan yang sesuai akan dipilih di Design Editor. Sebaliknya—misalnya, jika Anda mengklikTextView
di Design Editor, XML yang sesuai akan disorot.
Menghapus TextView
- Anda dapat menghapus
TextView
karena tidak diperlukan sekarang. Pastikan untuk menghapus semuanya dari<TextView
hingga/>
penutup.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Jadi, di dalam file tersebut hanya akan tersisa ConstraintLayout
:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
- Tambahkan padding 16 dp ke
ConstraintLayout
sehingga UI tidak akan berdesakan di tepi layar.
Padding mirip dengan margin, tetapi perbedaannya adalah padding menambahkan ruang ke bagian dalam ConstraintLayout
, bukan menambahkan ruang ke luar.
<androidx.constraintlayout.widget.ConstraintLayout
...
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
Menambahkan kolom teks biaya layanan (cost of service)
Pada langkah ini, Anda akan menambahkan elemen UI agar pengguna dapat memasukkan biaya layanan ke dalam aplikasi. Anda juga akan menggunakan elemen EditText
agar pengguna dapat memasukkan atau mengubah teks dalam aplikasi.
- Lihat dokumentasi
EditText
, dan periksa contoh XML. - Cari spasi kosong antara tag
ConstraintLayout
pembuka dan penutup. - Salin dan tempel XML dari dokumentasi ke spasi kosong tersebut dalam tata letak Anda di Android Studio.
File yang sudah jadi akan terlihat seperti ini:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/plain_text_input"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:inputType="text"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Anda tidak perlu khawatir jika belum memahaminya karena akan dijelaskan dalam langkah-langkah berikut.
- Perhatikan bahwa
EditText
digarisbawahi dengan warna merah. - Arahkan kursor ke atasnya, dan Anda akan melihat error "view is not constrained" yang seharusnya tidak asing lagi sejak codelab sebelumnya. Ingat bahwa turunan dari
ConstraintLayout
memerlukan batasan sehingga tata letak mengetahui cara mengaturnya.
- Tambahkan batasan ini ke
EditText
untuk menaruhnya di sudut kiri atas induk.
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
Jika Anda menulis dalam bahasa Inggris atau bahasa lain yang ditulis dari kiri ke kanan (LTR), tepi awalnya adalah kiri. Namun, beberapa bahasa seperti bahasa Arab yang ditulis dari kanan ke kiri (RTL) memiliki tepi awal di kanan. Itu sebabnya batasan menggunakan "start" sehingga bisa berfungsi dengan bahasa LTR ataupun RTL. Demikian pula, batasan menggunakan "end", bukan kanan, karena alasan yang sama.
Dengan batasan baru yang ditambahkan, elemen EditText
akan terlihat seperti ini:
<EditText
android:id="@+id/plain_text_input"
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:inputType="text"/>
Meninjau atribut EditText
Periksa kembali semua atribut EditText
yang Anda tempelkan untuk memastikannya berfungsi sebagaimana seharusnya di aplikasi Anda.
- Cari atribut
id
, yang ditetapkan ke@+id/plain_text_input
. - Ubah atribut
id
menjadi nama yang lebih sesuai,@+id/cost_of_service
.
- Lihat atribut
layout_height
. Atribut itu ditetapkan kewrap_content
yang berarti tingginya akan setinggi konten di dalamnya. Tidak apa-apa karena hanya akan ada 1 baris teks. - Lihat atribut
layout_width
. Atribut ini ditetapkan kematch_parent
, tetapi Anda tidak dapat menetapkanmatch_parent
pada turunanConstraintLayout
. Selain itu, kolom teks tidak harus terlalu lebar. Tetapkan menjadi lebar tetap sebesar160dp
, yang seharusnya memiliki banyak ruang bagi pengguna untuk memasukkan biaya layanan.
- Perhatikan atribut
inputType
—karena ini atribut baru. Nilai atribut adalah"text"
yang berarti pengguna dapat mengetikkan setiap karakter teks ke dalam kolom di layar (karakter alfabet, simbol, dll.)
android:inputType="text"
Namun, Anda ingin pengguna hanya mengetik angka ke dalam EditText
karena kolomnya mewakili nilai uang.
- Hapus kata
text
, tetapi biarkan tanda kutipnya. - Mulai ketik
number
di tempatnya. Setelah mengetik "n", Android Studio akan menampilkan daftar kemungkinan penyelesaian yang meliputi "n".
- Pilih
numberDecimal
untuk membatasinya ke angka dengan titik desimal.
android:inputType="numberDecimal"
Untuk melihat opsi jenis input lainnya, lihat Menentukan jenis metode input dalam dokumentasi developer.
Masih ada satu perubahan lagi yang harus dibuat karena menampilkan beberapa petunjuk tentang karakter yang harus dimasukkan pengguna ke dalam kolom ini akan sangat membantu.
- Tambahkan atribut
hint
keEditText
yang menjelaskan karakter yang harus dimasukkan pengguna dalam kolom.
android:hint="Cost of Service"
Anda juga akan melihat update Design Editor.
- Jalankan aplikasi Anda di emulator. Tampilannya akan terlihat seperti ini:
Bagus! Masih belum banyak, tetapi Anda sudah memulai dengan baik dan telah mengedit beberapa XML. XML untuk tata letak Anda akan terlihat seperti ini.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/cost_of_service"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:hint="Cost of Service"
android:inputType="numberDecimal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Menambahkan pertanyaan layanan
Pada langkah ini, Anda akan menambahkan TextView
untuk pertanyaan, "Bagaimana layanannya?" Coba ketikkan tanpa menyalin/menempel. Saran dari Android Studio dapat membantu Anda.
- Setelah penutup tag
EditText
, yakni/>
, tambahkan baris baru dan mulailah mengetikkan<TextView
. - Pilih
TextView
dari saran, dan Android Studio akan otomatis menambahkan atributlayout_width
danlayout_height
untukTextView
. - Pilih
wrap_content
untuk keduanya karena Anda hanya perluTextView
sebesar konten teks di dalamnya. - Tambahkan atribut
text
dengan"How was the service?"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="How was the service?"
- Tutup tag dengan
/>
. - Perhatikan dalam Design Editor bahwa
TextView
tumpang tindih denganEditText
.
Sepertinya masih kurang pas. Jadi, Anda harus menambahkan batasan pada TextView
berikutnya. Pikirkan batasan yang Anda butuhkan. Di mana posisi TextView
harus diposisikan secara horizontal dan vertikal? Anda dapat memeriksa screenshot aplikasi untuk mengetahuinya.
Secara vertikal, Anda ingin TextView
di bawah kolom teks biaya layanan. Secara horizontal, Anda ingin TextView
sejajar dengan tepi awal induknya.
- Tambahkan batasan horizontal ke
TextView
untuk membatasi tepi awalnya hingga tepi awal induk.
app:layout_constraintStart_toStartOf="parent"
- Tambahkan batasan vertikal ke
TextView
untuk membatasi tepi atasTextView
ke tepi bawahView
biaya layanan.
app:layout_constraintTop_toBottomOf="@id/cost_of_service"
Perhatikan bahwa tidak ada nilai tambah di @id/cost_of_service
karena ID sudah ditentukan.
Sepertinya ini bukan tampilan terbaik, tetapi jangan khawatir. Anda hanya ingin memastikan semua bagian yang diperlukan berada di layar dan fungsinya dapat digunakan. Anda akan memperbaiki tampilannya di codelab berikut.
- Tambahkan ID resource di
TextView
. Anda harus merujuk ke tampilan ini nanti saat menambahkan lebih banyak tampilan dan membatasi satu sama lain.
android:id="@+id/service_question"
Pada titik ini, XML Anda akan terlihat seperti ini.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/cost_of_service"
android:hint="Cost of Service"
android:layout_height="wrap_content"
android:layout_width="160dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:inputType="numberDecimal"/>
<TextView
android:id="@+id/service_question"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="How was the service?"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cost_of_service"/>
</androidx.constraintlayout.widget.ConstraintLayout>
5. Menambahkan opsi tip
Selanjutnya, Anda akan menambahkan tombol pilihan untuk berbagai opsi tip yang dapat dipilih pengguna.
Harus ada tiga opsi:
- Luar biasa (20%)
- Bagus (18%)
- Lumayan (15%)
Jika tidak yakin cara melakukannya, Anda dapat melakukan penelusuran Google. Alat hebat ini biasanya digunakan developer saat menemukan masalah.
- Lakukan penelusuran Google untuk
radio button android
. Hasil teratas merupakan panduan dari situs developer Android tentang cara menggunakan tombol pilihan—sempurna!
- Baca Panduan Tombol Pilihan.
Dengan membaca deskripsi, Anda dapat memastikan bahwa Anda dapat menggunakan elemen UI RadioButton
di tata letak untuk setiap tombol pilihan yang diperlukan. Selain itu, Anda juga perlu mengelompokkan tombol pilihan dalam RadioGroup
karena hanya satu opsi yang dapat dipilih sekaligus.
Ada beberapa XML yang tampaknya sesuai dengan kebutuhan Anda. Baca seluruhnya dan lihat cara RadioGroup
menjadi tampilan induk dan RadioButtons
menjadi tampilan turunan di dalamnya.
- Kembali ke tata letak di Android Studio untuk menambahkan
RadioGroup
danRadioButton
ke aplikasi Anda. - Setelah elemen
TextView
, tetapi masih dalamConstraintLayout
, mulai ketik<RadioGroup
. Android Studio akan memberikan saran yang berguna untuk membantu Anda menyelesaikan XML. - Tetapkan
layout_width
danlayout_height
dariRadioGroup
kewrap_content
. - Tambahkan ID resource yang ditetapkan ke
@+id/tip_options
. - Tutup tag awal dengan
>
. - Android Studio menambahkan
</RadioGroup>
. Seperti halnyaConstraintLayout
, elemenRadioGroup
juga akan memiliki elemen lain di dalamnya. Jadi, Anda mungkin ingin memindahkannya ke barisnya sendiri. - Batasi
RadioGroup
di bawah pertanyaan layanan (secara vertikal) dan ke bagian awal induk (secara horizontal). - Tetapkan atribut
android:orientation
kevertical
. Jika menginginkanRadioButtons
berada dalam satu baris, Anda dapat menetapkan orientasinya kehorizontal
.
XML untuk RadioGroup
akan terlihat seperti ini:
<RadioGroup
android:id="@+id/tip_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/service_question">
</RadioGroup>
Menambahkan RadioButtons
- Setelah atribut terakhir
RadioGroup
, tetapi sebelum tag akhir</RadioGroup>
, tambahkanRadioButton
.
<RadioGroup
android:id="@+id/tip_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/service_question">
<!-- add RadioButtons here -->
</RadioGroup>
- Tetapkan
layout_width
danlayout_height
kewrap_content
. - Tetapkan ID resource
@+id/option_twenty_percent
keRadioButton
. - Tetapkan teks ke
Amazing (20%)
. - Tutup tag dengan
/>
.
<RadioGroup
android:id="@+id/tip_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/service_question"
app:layout_constraintStart_toStartOf="parent"
android:orientation="vertical">
<RadioButton
android:id="@+id/option_twenty_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Amazing (20%)" />
</RadioGroup>
Setelah menambahkan satu RadioButton
, bisakah Anda memodifikasi XML untuk menambahkan 2 tombol pilihan lagi untuk opsi Good (18%)
dan Okay (15%)
?
Seperti inilah tampilan XML untuk RadioGroup
dan RadioButtons
:
<RadioGroup
android:id="@+id/tip_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/service_question"
app:layout_constraintStart_toStartOf="parent"
android:orientation="vertical">
<RadioButton
android:id="@+id/option_twenty_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Amazing (20%)" />
<RadioButton
android:id="@+id/option_eighteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Good (18%)" />
<RadioButton
android:id="@+id/option_fifteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Okay (15%)" />
</RadioGroup>
Menambahkan pilihan default
Saat ini, tidak ada opsi tip yang dipilih. Sebaiknya pilih salah satu opsi tombol pilihan secara default.
Terdapat atribut di RadioGroup
yang dapat Anda gunakan untuk menentukan tombol yang harus dipilih terlebih dahulu. Atribut itu disebut checkedButton
, dan Anda menetapkannya ke ID resource tombol pilihan yang ingin dipilih.
- Pada
RadioGroup
, tetapkan atributandroid:checkedButton
ke@id/option_twenty_percent
.
<RadioGroup
android:id="@+id/tip_options"
android:checkedButton="@id/option_twenty_percent"
...
Perhatikan di Design Editor bahwa tata letak telah diperbarui. Opsi tip 20% dipilih secara default—sungguh keren! Sekarang tampilannya sudah mulai terlihat seperti kalkulator tip.
Berikut tampilan XML-nya sejauh ini:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/cost_of_service"
android:hint="Cost of Service"
android:layout_height="wrap_content"
android:layout_width="160dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:inputType="numberDecimal"/>
<TextView
android:id="@+id/service_question"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="How was the service?"
app:layout_constraintTop_toBottomOf="@id/cost_of_service"
app:layout_constraintStart_toStartOf="parent" />
<RadioGroup
android:id="@+id/tip_options"
android:checkedButton="@id/option_twenty_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/service_question"
app:layout_constraintStart_toStartOf="parent"
android:orientation="vertical">
<RadioButton
android:id="@+id/option_twenty_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Amazing (20%)" />
<RadioButton
android:id="@+id/option_eighteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Good (18%)" />
<RadioButton
android:id="@+id/option_fifteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Okay (15%)" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
6. Menyelesaikan seluruh tata letak
Anda sekarang berada di bagian terakhir tata letak. Anda akan menambahkan Switch
, Button
, dan TextView
untuk menampilkan jumlah tip.
Menambahkan Tombol untuk membulatkan tip
Selanjutnya, Anda akan menggunakan widget Switch
agar pengguna dapat memilih untuk membulatkan tip atau tidak.
Anda ingin agar Switch
selebar induknya sehingga Anda mungkin menganggap lebar harus ditetapkan ke match_parent
. Seperti yang telah disebutkan sebelumnya, Anda tidak dapat menetapkan match_parent
pada elemen UI di ConstraintLayout
. Sebagai gantinya, Anda harus membatasi tepi awal dan akhir tampilan, serta menetapkan lebar ke 0dp
. Menetapkan lebar ke 0dp
akan memberi tahu sistem untuk tidak menghitung lebar, tetapi cukup dengan mencoba mencocokkan batasan yang ada di tampilan.
- Tambahkan elemen
Switch
setelah XML untukRadioGroup
. - Seperti yang telah disebutkan di atas, tetapkan
layout_width
ke0dp
. - Tetapkan
layout_height
kewrap_content
. Tindakan ini akan menjadikan tampilanSwitch
setinggi konten di dalamnya. - Tetapkan atribut
id
ke@+id/round_up_switch
. - Tetapkan atribut
text
keRound up tip?
. Setelan ini akan digunakan sebagai label untukSwitch
. - Batasi tepi awal
Switch
ke tepi awal induktip_options
dan akhir ke akhir induk. - Batasi bagian atas
Switch
ke bagian bawahtip_options
. - Tutup tag dengan
/>
.
Akan lebih baik jika tombol diaktifkan secara default, dan tersedia atribut untuk melakukan itu, android:checked
, dengan nilai yang memungkinkan adalah true
(aktif) atau false
(nonaktif).
- Tetapkan atribut
android:checked
ketrue
.
Dengan menggabungkan semuanya, XML untuk elemen Switch
akan terlihat seperti ini:
<Switch
android:id="@+id/round_up_switch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:checked="true"
android:text="Round up tip?"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/tip_options"
app:layout_constraintTop_toBottomOf="@id/tip_options" />
Menambahkan tombol Calculate (Hitung)
Selanjutnya, Anda akan menambahkan Button
sehingga pengguna dapat meminta tip dihitung. Anda ingin agar tombol menjadi selebar induk, sehingga lebar dan batasan horizontal sama seperti untuk Switch
sebelumnya.
- Tambahkan
Button
setelahSwitch
. - Tetapkan lebar ke
0dp
, seperti yang Anda lakukan untukSwitch
. - Tetapkan tinggi ke
wrap_content
. - Berikan ID resource
@+id/calculate_button
, dengan teks"Calculate"
. - Batasi tepi atas
Button
ke tepi bawahSwitch
Round up tip?. - Batasi tepi awal ke tepi awal induk dan tepi akhir ke tepi akhir induk.
- Tutup tag dengan
/>
.
Berikut tampilan XML untuk Button
Calculate:
<Button
android:id="@+id/calculate_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Calculate"
app:layout_constraintTop_toBottomOf="@id/round_up_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
Menambahkan hasil tip
Anda hampir menyelesaikan tata letak. Di langkah ini, Anda akan menambahkan TextView
untuk hasil tip, menempatkannya di bawah tombol Calculate, dan disejajarkan dengan bagian akhir, bukan di awal seperti elemen UI lainnya.
- Tambahkan
TextView
dengan ID resource bernamatip_result
dan teksTip Amount
. - Batasi tepi akhir
TextView
ke tepi akhir induk. - Batasi tepi atas ke tepi bawah tombol Calculate.
<TextView
android:id="@+id/tip_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/calculate_button"
android:text="Tip Amount" />
- Jalankan aplikasi. Tampilannya akan terlihat seperti screenshot ini.
Bagus, khususnya jika ini pertama kalinya Anda bekerja dengan XML.
Perhatikan bahwa aplikasi mungkin tidak terlihat sama persis dengan screenshot karena mungkin template di Android Studio versi terbaru telah berubah. Tombol Calculate belum mulai digunakan, tetapi Anda dapat mengetikkan biaya, memilih persentase tip, dan beralih opsi untuk membulatkan tip atau tidak. Anda akan mulai menggunakan tombol Calculate di codelab berikutnya. Jadi, pastikan untuk kembali lagi.
7. Menerapkan praktik coding yang baik
Mengekstrak string
Anda mungkin telah melihat peringatan tentang string hard code. Coba ingat kembali dari codelab sebelumnya bahwa mengekstrak string ke file resource akan mempermudah untuk menerjemahkan aplikasi ke bahasa lain dan menggunakan kembali string. Buka activity_main.xml
dan ekstrak semua resource string.
- Klik string; arahkan kursor ke ikon bohlam kuning yang muncul, lalu klik segitiga di sebelahnya; pilih Extract String Resource. Tidak ada masalah pada nama default untuk resource string. Jika mau, untuk opsi tip, Anda dapat menggunakan
amazing_service
,good_service
, danok_service
untuk membuat nama lebih deskriptif.
Sekarang verifikasi resource string yang baru saja Anda tambahkan.
- Jika jendela Project tidak muncul, klik tab Project di sisi kiri jendela.
- Buka app > res > values > strings.xml untuk melihat semua resource string UI.
<resources>
<string name="app_name">Tip Time</string>
<string name="cost_of_service">Cost of Service</string>
<string name="how_was_the_service">How was the service?</string>
<string name="amazing_service">Amazing (20%)</string>
<string name="good_service">Good (18%)</string>
<string name="ok_service">Okay (15%)</string>
<string name="round_up_tip">Round up tip?</string>
<string name="calculate">Calculate</string>
<string name="tip_amount">Tip Amount</string>
</resources>
Memformat ulang XML
Android Studio menyediakan berbagai alat untuk merapikan kode Anda dan memastikannya mengikuti konvensi coding yang direkomendasikan.
- Di
activity_main.xml
, pilih Edit > Select All. - Pilih Code > Reformat Code.
Ini akan memastikan indentasinya konsisten, dan dapat menyusun ulang sebagian XML elemen UI untuk mengelompokkan berbagai tugas, misalnya, mengelompokkan semua atribut android:
dari satu elemen.
8. Kode solusi
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/cost_of_service"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:hint="@string/cost_of_service"
android:inputType="numberDecimal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/service_question"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/how_was_the_service"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cost_of_service" />
<RadioGroup
android:id="@+id/tip_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checkedButton="@id/option_twenty_percent"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/service_question">
<RadioButton
android:id="@+id/option_twenty_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/amazing_service" />
<RadioButton
android:id="@+id/option_eighteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/good_service" />
<RadioButton
android:id="@+id/option_fifteen_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ok_service" />
</RadioGroup>
<Switch
android:id="@+id/round_up_switch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/round_up_tip"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/tip_options"
app:layout_constraintTop_toBottomOf="@id/tip_options" />
<Button
android:id="@+id/calculate_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/calculate"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/round_up_switch" />
<TextView
android:id="@+id/tip_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tip_amount"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/calculate_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
res/values/strings.xml
<resources>
<string name="app_name">Tip Time</string>
<string name="cost_of_service">Cost of Service</string>
<string name="how_was_the_service">How was the service?</string>
<string name="amazing_service">Amazing (20%)</string>
<string name="good_service">Good (18%)</string>
<string name="ok_service">Okay (15%)</string>
<string name="round_up_tip">Round up tip?</string>
<string name="calculate">Calculate</string>
<string name="tip_amount">Tip Amount</string>
</resources>
9. Ringkasan
- XML (Extensible Markup Language) adalah suatu cara mengatur teks yang terdiri dari tag, elemen, dan atribut.
- Gunakan XML untuk menentukan tata letak aplikasi Android.
- Gunakan
EditText
untuk mengizinkan pengguna memasukkan atau mengedit teks. EditText
dapat berisi petunjuk bagi pengguna karena menjelaskan isi kolom tersebut.- Tentukan atribut
android:inputType
untuk membatasi jenis teks yang dapat dimasukkan pengguna ke dalam kolomEditText
. - Buat daftar opsi eksklusif dengan
RadioButtons
yang dikelompokkan denganRadioGroup
. RadioGroup
bisa vertikal atau horizontal, dan Anda dapat menentukanRadioButton
yang harus dipilih di awal.- Gunakan
Switch
untuk memungkinkan pengguna beralih antara dua opsi. - Anda dapat menambahkan label ke
Switch
tanpa menggunakanTextView
yang terpisah. - Setiap turunan dari
ConstraintLayout
harus memiliki batasan vertikal dan horizontal. - Gunakan batasan "start" dan "end" untuk menangani jenis bahasa Kiri ke Kanan (LTR) dan Kanan ke Kiri (RTL).
- Nama atribut batasan mengikuti bentuk
layout_constraint<Source>_to<Target>Of
. - Untuk membuat
View
selebarConstraintLayout
, masukkan "start" dan "end" ke awal dan akhir induk, dan tetapkan lebar ke 0 dp.
10. Mempelajari lebih lanjut
Di bawah ini tersedia link ke dokumentasi lainnya yang berisi topik yang dibahas. Anda dapat menemukan semua dokumentasi Pengembangan Android di developer.android.com. Dan jangan lupa, Anda dapat melakukan penelusuran Google jika mengalami masalah.
11. Berlatih sendiri
Lakukan hal berikut:
- Buat aplikasi kalkulator yang berbeda, seperti pengonversi satuan untuk memasak, untuk mengonversi mililiter ke ons cairan atau sebaliknya, gram ke cup atau sebaliknya, dan sebagainya. Kolom apa yang Anda butuhkan?