Aktivitas dan Intent

1. Pengantar

Sejauh ini, aplikasi yang telah Anda kerjakan hanya memiliki satu aktivitas. Pada kenyataannya, banyak aplikasi Android membutuhkan beberapa aktivitas dengan navigasi antar-aplikasi.

Dalam codelab ini, Anda akan membuat aplikasi kamus yang menggunakan beberapa aktivitas, menggunakan intent untuk berpindah di antara keduanya, dan meneruskan data ke aplikasi lain.

Prasyarat

Anda harus sudah mampu:

  • Menavigasi sebuah project di Android Studio.
  • Menggunakan dan menambahkan resource XML di Android studio.
  • Mengganti dan menerapkan metode di class yang sudah ada.
  • Membuat instance class Kotlin, mengakses properti class, dan memanggil metode.
  • Lihat dokumentasi di developer.android.com untuk mempelajari class tertentu lebih lanjut.

Yang akan Anda pelajari

Caranya:

  • Menggunakan intent eksplisit untuk mengarahkan ke aktivitas tertentu.
  • Menggunakan intent implisit untuk membuka konten di aplikasi lain.
  • Menambahkan opsi menu untuk menambahkan tombol ke panel aplikasi.

Yang akan Anda build

  • Memodifikasi aplikasi kamus untuk menerapkan navigasi antar-layar menggunakan intent dan menambahkan menu opsi.

Yang Anda perlukan

  • Komputer yang dilengkapi Android Studio.

2. Kode awal

Di beberapa langkah berikutnya, Anda akan mengerjakan aplikasi Words. Aplikasi Words adalah aplikasi kamus sederhana, yang berisi daftar huruf, kata untuk setiap huruf, dan kemampuan untuk mencari definisi setiap kata di browser.

Ada banyak hal yang terjadi, tetapi jangan khawatir karena Anda tidak perlu mem-build seluruh aplikasi hanya untuk mempelajari intent. Sebagai gantinya, Anda diberi versi project yang tidak lengkap, atau project awal.

Saat semua layar diterapkan, Anda belum dapat berpindah dari satu layar ke layar lainnya. Tugas Anda adalah menggunakan intent sehingga seluruh project berfungsi tanpa harus membuat semuanya dari awal.

Mendownload kode awal untuk codelab ini

Codelab ini menyediakan kode awal bagi Anda untuk diperluas dengan fitur yang dipelajari dalam codelab ini. Kode awal mungkin berisi kode yang tidak asing bagi Anda dari codelab sebelumnya. Kode ini mungkin juga berisi kode yang asing bagi Anda dan kode yang akan Anda pelajari dalam codelab berikutnya.

Saat Anda mendownload kode awal dari GitHub, pastikan nama foldernya adalah android-basics-kotlin-words-app-starter. Pilih folder ini saat Anda membuka project di Android Studio.

Jika Anda terbiasa dengan perintah git, perhatikan bahwa kode awal berada dalam cabang yang disebut "starter". Setelah Anda meng-clone repo, periksa kode dari cabang origin/starter. Jika Anda belum pernah menggunakan perintah git, ikuti langkah di bawah untuk mendownload kode dari GitHub.

  1. Buka halaman repositori GitHub yang disediakan untuk project.
  2. Pastikan nama cabang cocok dengan nama cabang yang ditentukan dalam codelab. Misalnya, dalam screenshot berikut, nama cabang adalah main (utama).

1e4c0d2c081a8fd2.png

  1. Di halaman GitHub project, klik tombol Code yang akan menampilkan pop-up.

1debcf330fd04c7b.png

  1. Pada pop-up, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
  2. Temukan file di komputer Anda (mungkin di folder Downloads).
  3. Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.

Membuka project di Android Studio

  1. Mulai Android Studio.
  2. Di jendela Welcome to Android Studio, klik Open.

d8e9dbdeafe9038a.png

Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > Open.

8d1fda7396afe8e5.png

  1. Di file browser, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
  2. Klik dua kali pada folder project tersebut.
  3. Tunggu Android Studio membuka project.
  4. Klik tombol Run 8de56cba7583251f.png untuk membangun dan menjalankan aplikasi. Pastikan aplikasi dibangun seperti yang diharapkan.

3. Ringkasan aplikasi Words

Sebelum melanjutkan, luangkan waktu untuk memahami project ini. Anda sudah harus memahami semua konsep dari unit sebelumnya. Saat ini, aplikasi terdiri dari dua aktivitas dan masing-masing memiliki tampilan recycler dan adaptor.

61af34429128695e.png

Anda akan secara khusus menggunakan file berikut:

  1. LetterAdapter digunakan oleh RecyclerView di MainActivity. Setiap huruf adalah tombol dengan onClickListener yang saat ini sedang kosong. Di sinilah Anda akan menangani penekanan tombol untuk membuka DetailActivity.
  2. WordAdapter digunakan oleh RecyclerView di DetailActivity untuk menampilkan daftar kata. Meskipun belum dapat membuka layar ini, Anda harus mengetahui bahwa setiap kata juga memiliki tombol yang sesuai dengan onClickListener. Di sinilah Anda akan menambahkan kode yang akan mengalihkan ke browser untuk menampilkan definisi kata.
  3. MainActivity juga perlu beberapa perubahan. Di sinilah Anda akan mengimplementasikan menu opsi untuk menampilkan sebuah tombol sehingga pengguna dapat beralih di antara tata letak daftar dan petak.

ce3474dba2a9c1c8.png

Setelah Anda merasa nyaman dengan project tersebut, lanjutkan ke bagian berikutnya untuk mempelajari intent.

4. Pengantar Intent

Setelah menyiapkan project awal, mari membahas intent dan cara menggunakannya di aplikasi Anda.

Intent adalah objek yang mewakili beberapa tindakan yang akan dilakukan. Penggunaan yang paling umum dari intent, tetapi bukan satu-satunya, adalah untuk meluncurkan aktivitas. Ada dua jenis intent, yaitu implisit dan eksplisit. Intent eksplisit bersifat sangat spesifik, karena Anda mengetahui aktivitas pasti yang akan diluncurkan, sering kali berupa layar di aplikasi Anda.

Intent implisit sedikit lebih abstrak karena Anda gunakan untuk memberi tahu sistem tentang jenis tindakan, seperti membuka link, menulis email, atau menelepon, dan sistem bertanggung jawab untuk mencari tahu cara memenuhi permintaan itu. Anda mungkin tanpa sadar telah melihat kedua jenis intent tersebut. Umumnya, saat menampilkan aktivitas di aplikasi Anda sendiri, Anda menggunakan intent eksplisit.

Namun, untuk tindakan yang tidak memerlukan aplikasi saat ini—misalnya, Anda menemukan halaman dokumentasi Android yang menarik dan ingin membagikannya dengan teman—Anda akan menggunakan intent implisit. Anda mungkin melihat menu seperti di bawah ini yang menanyakan aplikasi mana yang akan digunakan untuk membagikan halaman.

e9c77033d9224170.png

Anda menggunakan intent eksplisit untuk melakukan tindakan atau menampilkan layar di aplikasi Anda sendiri dan bertanggung jawab atas keseluruhan proses. Anda biasanya menggunakan intent implisit untuk melakukan tindakan yang melibatkan aplikasi lain dan mengandalkan sistem untuk menentukan hasil akhirnya. Anda akan menggunakan kedua jenis intent di aplikasi Words.

702236c6e2276f91.png

5. Menyiapkan Intent Eksplisit

Saatnya menerapkan intent pertama Anda. Di layar pertama, saat mengetuk huruf, pengguna akan diarahkan ke layar kedua yang berisi daftar kata. DetailActivity sudah diterapkan sehingga Anda hanya perlu meluncurkannya dengan intent. Anda menggunakan intent eksplisit karena aplikasi Anda tahu persis aktivitas mana yang harus diluncurkan.

Membuat dan menggunakan intent hanya memerlukan beberapa langkah:

  1. Buka LetterAdapter.kt dan scroll ke bawah ke onBindViewHolder(). Di bawah baris untuk menetapkan teks tombol, tetapkan ke onClickListener untuk holder.button.
holder.button.setOnClickListener {

}
  1. Kemudian, dapatkan referensi ke context.
val context = holder.itemView.context
  1. Buat Intent yang akan meneruskan konteks dan nama class aktivitas tujuan.
val intent = Intent(context, DetailActivity::class.java)

Nama aktivitas yang ingin ditampilkan ditentukan dengan DetailActivity::class.java. Objek DetailActivity sebenarnya dibuat di belakang layar.

  1. Panggil metode putExtra dengan memasukkan "letter" sebagai argumen pertama dan button text sebagai argumen kedua.
intent.putExtra("letter", holder.button.text.toString())

Apa yang dimaksud tambahan? Ingat bahwa intent hanyalah serangkaian petunjuk dan belum ada instance aktivitas tujuan. Sebaliknya, tambahan adalah potongan data, seperti angka atau string, yang diberi nama untuk diambil nanti. Hal ini mirip dengan meneruskan argumen saat Anda memanggil fungsi. Anda harus memberi tahu huruf yang akan ditampilkan karena DetailActivity dapat ditampilkan untuk setiap huruf.

Selain itu, menurut Anda mengapa perlu memanggil toString()? Teks tombol sudah berupa string, bukan?

Sepertinya saya lumayan paham. Ini sebenarnya dari jenis CharSequence yang disebut antarmuka. Anda tidak harus memahami antarmuka Kotlin untuk saat ini, selain bahwa cara ini digunakan untuk memastikan bahwa jenis, seperti String, menerapkan fungsi dan properti tertentu. Anda dapat menganggap CharSequence sebagai representasi yang lebih umum dari class yang seperti string. Properti text tombol bisa berupa string, atau bisa juga objek yang juga merupakan CharSequence. Namun, metode putExtra() menerima String, bukan hanya CharSequence, sehingga perlu memanggil toString().

  1. Panggil metode startActivity() pada objek konteks, dengan meneruskan intent.
context.startActivity(intent)

Sekarang jalankan aplikasi dan coba ketuk sebuah huruf. Layar detail ditampilkan. Apa pun huruf yang diketuk pengguna, layar detail akan selalu menampilkan kata untuk huruf A. Anda masih memiliki beberapa pekerjaan yang harus dilakukan dalam aktivitas detail untuk menampilkan kata untuk huruf apa pun yang diteruskan sebagai tambahan intent.

6. Menyiapkan DetailActivity

Anda baru saja membuat intent eksplisit Anda yang pertama. Sekarang ke layar detail.

Di metode onCreate DetailActivity, setelah panggilan ke setContentView, ganti huruf hard code dengan kode untuk mendapatkan letterId yang diteruskan dari intent.

val letterId = intent?.extras?.getString("letter").toString()

Ada banyak hal terjadi di sini, jadi mari kita lihat setiap bagian:

Pertama, dari mana properti intent berasal? Ini bukan properti dari DetailActivity, melainkan properti yang dimiliki oleh setiap aktivitas. Properti ini menyimpan referensi ke intent yang digunakan untuk meluncurkan aktivitas.

Properti tambahan memiliki jenis Bundle, dan seperti yang mungkin sudah Anda duga, properti ini menyediakan cara untuk mengakses semua tambahan yang diteruskan ke intent.

Kedua properti ini ditandai dengan tanda tanya. Mengapa seperti itu? Alasannya karena properti intent dan extras adalah nullable, artinya properti tersebut mungkin memiliki nilai ataupun tidak. Terkadang Anda mungkin menginginkan variabel menjadi null. Properti intent mungkin sebenarnya bukan Intent (jika aktivitas tidak diluncurkan dari intent) dan properti tambahan mungkin sebenarnya bukan Bundle, melainkan nilai yang disebut null. Di Kotlin, null berarti tidak ada nilai. Objek mungkin ada atau mungkin berupa null. Jika aplikasi Anda mencoba mengakses properti atau memanggil fungsi di objek null, aplikasi akan mengalami error. Untuk mengakses nilai ini dengan aman, beri tanda ? setelah nama. Jika intent bernilai null, aplikasi Anda bahkan tidak akan dapat mengakses properti tambahan, dan jika extras bernilai null, kode Anda bahkan tidak akan mencoba memanggil getString().

Bagaimana cara mengetahui properti yang memerlukan tanda tanya untuk memastikan keamanan null? Anda dapat mengetahui apakah nama jenis diikuti dengan tanda tanya atau tanda seru.

b43155b06a5556e.png

Hal terakhir yang perlu diperhatikan adalah huruf yang sebenarnya diambil dengan getString yang menampilkan String?. Jadi, toString() dipanggil untuk memastikan hurufnya adalah String, bukan null.

Sekarang, saat menjalankan aplikasi dan membuka layar detail, Anda akan melihat daftar kata untuk setiap huruf.

c465ef280fe3792a.png

Membersihkan

Kedua kode digunakan untuk melakukan intent, dan mengambil hard code huruf yang dipilih yang bernama extra, "letter". Meskipun sesuai untuk contoh kecil ini, ini bukan pendekatan terbaik untuk aplikasi besar yang memiliki lebih banyak tambahan intent untuk dilacak.

Meskipun Anda bisa membuat konstanta yang disebut "letter", konstanta ini bisa menjadi tidak stabil karena penambahan intent tambahan ke aplikasi. Di class manakah Anda akan menempatkan konstanta ini? Ingat bahwa string tersebut digunakan dalam DetailActivity dan MainActivity. Anda memerlukan cara untuk menentukan konstanta yang dapat digunakan di beberapa class sembari menjaga kode Anda tetap teratur.

Untungnya, ada fitur Kotlin yang bermanfaat serta dapat digunakan untuk memisahkan konstanta Anda dan menggunakannya tanpa instance tertentu dari class yang disebut objek pendamping. Objek pendamping serupa dengan objek lain, seperti instance class. Namun, hanya satu instance objek pendamping yang akan ada selama durasi program Anda. Itulah sebabnya instance objek ini terkadang disebut pola singleton. Meskipun ada banyak kasus penggunaan untuk singleton di luar cakupan codelab ini, untuk saat ini, Anda akan menggunakan objek pendamping untuk mengatur konstanta dan memungkinkannya diakses di luar DetailActivity. Anda akan mulai dengan menggunakan objek pendamping untuk memfaktorkan ulang kode untuk tambahan "letter".

  1. Di DetailActivity, tepat di atas onCreate, tambahkan baris berikut:
companion object {

}

Ini mirip dengan cara menentukan class, kecuali Anda menggunakan kata kunci object. Ada juga kata kunci companion yang berarti kata kunci tersebut berkaitan dengan class DetailActivity, dan kita tidak perlu memberinya nama jenis yang terpisah.

  1. Dalam tanda kurung kurawal, tambahkan properti untuk konstanta huruf.
const val LETTER = "letter"
  1. Untuk menggunakan konstanta baru, perbarui panggilan letter hard code di onCreate() seperti berikut:
val letterId = intent?.extras?.getString(LETTER).toString()

Sekali lagi, perhatikan bahwa Anda mereferensikannya dengan notasi titik seperti biasa, tetapi konstantanya adalah milik DetailActivity.

  1. Beralih ke LetterAdapter, dan ubah panggilan ke putExtra untuk menggunakan konstanta baru.
intent.putExtra(DetailActivity.LETTER, holder.button.text.toString())

Semua siap. Dengan memfaktorkan ulang, kode menjadi lebih mudah dibaca dan dikelola. Jika ini, atau konstanta lainnya yang Anda tambahkan, perlu diubah, Anda hanya perlu melakukannya di satu tempat.

Untuk mempelajari objek pendamping lebih lanjut, baca dokumentasi Kotlin tentang Ekspresi dan Deklarasi Objek.

7. Menyiapkan Intent Implisit

Pada umumnya, Anda akan menampilkan aktivitas tertentu dari aplikasi Anda sendiri. Namun, terkadang mungkin saja Anda tidak mengetahui aktivitas atau aplikasi yang ingin diluncurkan. Pada layar detail, setiap kata merupakan tombol yang akan menampilkan definisi kata dari pengguna.

Untuk contoh, Anda akan menggunakan fungsi kamus yang disediakan oleh penelusuran Google. Anda tidak akan menambahkan aktivitas baru ke aplikasi, melainkan akan meluncurkan browser perangkat untuk menampilkan halaman penelusuran.

Jadi, mungkin Anda perlu intent untuk memuat halaman di Chrome yang merupakan browser default di Android?

Kurang tepat.

Bisa jadi beberapa pengguna lebih menyukai browser pihak ketiga. Atau, ponsel mereka dilengkapi dengan browser yang telah diinstal lebih dulu oleh produsen. Mungkin mereka telah menginstal aplikasi Google Penelusuran, atau bahkan aplikasi kamus pihak ketiga.

Anda tidak dapat mengetahui dengan pasti aplikasi yang telah diinstal pengguna. Anda juga tidak dapat mengasumsikan cara mereka ingin mencari kata. Ini adalah contoh waktu penggunaan intent implisit yang sempurna. Aplikasi Anda memberikan informasi tentang tindakan yang seharusnya dilakukan ke sistem, dan sistem mengetahui apa yang harus dilakukan dengan tindakan tersebut, sehingga meminta informasi tambahan dari pengguna, jika diperlukan.

Lakukan hal berikut untuk membuat intent implisit:

  1. Untuk aplikasi ini, Anda akan melakukan penelusuran di Google. Hasil penelusuran pertama merupakan definisi kamus dari kata tersebut. Karena URL dasar yang sama digunakan untuk setiap penelusuran, sebaiknya Anda mendefinisikan ini sebagai konstantanya sendiri. Di DetailActivity, ubah objek pendamping untuk menambahkan konstanta baru, SEARCH_PREFIX. Berikut adalah URL dasar untuk penelusuran Google.
companion object {
   const val LETTER = "letter"
   const val SEARCH_PREFIX = "https://www.google.com/search?q="
}
  1. Lalu, buka WordAdapter dan dengan metode onBindViewHolder(), panggil setOnClickListener() di tombol. Mulai dengan membuat Uri untuk kueri penelusuran. Saat memanggil parse() untuk membuat Uri dari String, Anda harus menggunakan pemformatan string sehingga kata tersebut ditambahkan ke SEARCH_PREFIX.
holder.button.setOnClickListener {
    val queryUrl: Uri = Uri.parse("${DetailActivity.SEARCH_PREFIX}${item}")
}

Mungkin Anda belum tahu apa itu URI, dan ini tidak salah ketik, tetapi merupakan singkatan dari Uniform Resource Identifier. Anda mungkin sudah mengetahui bahwa URL, atau Uniform Resource Locator, adalah suatu string yang mengarah ke halaman web. URI adalah istilah yang lebih umum untuk format tersebut. Semua URL adalah URI, tetapi tidak semua URI adalah URL. URI lain, misalnya, alamat untuk nomor telepon, akan dimulai dengan tel:, tetapi ini dianggap sebagai URN atau Uniform Resource Name, bukan URL. Jenis data yang digunakan untuk mewakili keduanya disebut URI.

828cef3fdcfdaed.png

Perhatikan bahwa tidak ada referensi ke aktivitas apa pun dalam aplikasi Anda di sini. Anda hanya memberikan URI, tanpa indikasi cara menggunakannya.

  1. Setelah menentukan queryUrl, inisialisasi objek intent baru:
val intent = Intent(Intent.ACTION_VIEW, queryUrl)

Anda tidak akan menyampaikan dalam konteks dan aktivitas, melainkan akan meneruskan Intent.ACTION_VIEW bersama dengan URI.

ACTION_VIEW adalah intent umum yang menggunakan URI, dan dalam hal ini yang digunakan ialah alamat web. Sistem akan mengetahui cara memproses intent ini dengan membuka URI di browser web pengguna. Beberapa jenis intent lainnya meliputi:

  • CATEGORY_APP_MAPS - meluncurkan aplikasi peta
  • CATEGORY_APP_EMAIL - meluncurkan aplikasi email
  • CATEGORY_APP_GALLERY - meluncurkan aplikasi galeri (foto)
  • ACTION_SET_ALARM - menyetel alarm di latar belakang
  • ACTION_DIAL – melakukan panggilan telepon

Untuk mempelajari lebih lanjut, buka dokumentasi untuk beberapa intent yang umum digunakan.

  1. Terakhir, meskipun tidak meluncurkan aktivitas tertentu di aplikasi, Anda memberi tahu sistem untuk meluncurkan aplikasi lain, dengan memanggil startActivity() dan meneruskan intent.
context.startActivity(intent)

Sekarang, saat Anda meluncurkan aplikasi, membuka daftar kata, dan mengetuk salah satu kata, perangkat Anda harus membuka URL (atau menampilkan daftar opsi bergantung pada aplikasi yang terinstal).

Perilaku yang tepat akan berbeda-beda di antara pengguna sehingga semua orang akan mendapatkan pengalaman yang lancar tanpa mempersulit kode Anda.

8. Menyiapkan Menu dan Ikon

Kini aplikasi Anda telah sepenuhnya dapat dijelajahi dengan menambahkan intent eksplisit dan implisit, dan sekarang saatnya menambahkan opsi menu agar pengguna bisa beralih antara tata letak daftar dan petak untuk huruf tersebut.

Saat ini, Anda mungkin melihat banyak aplikasi memiliki panel ini di bagian atas layar. Inilah yang disebut sebagai panel aplikasi, dan selain menampilkan nama aplikasi, panel aplikasi dapat disesuaikan dan menghosting banyak fungsi yang berguna, seperti pintasan untuk berbagai tindakan penting, atau menu tambahan.

dfc4095251c1466e.png

Untuk aplikasi ini, meskipun kami tidak akan menambahkan menu yang lengkap, Anda akan mempelajari cara menambahkan tombol khusus ke panel aplikasi, sehingga pengguna dapat mengubah tata letak.

  1. Pertama, Anda harus mengimpor dua ikon untuk mewakili tampilan petak dan daftar. Tambahkan aset vektor gambar klip yang disebut "modul tampilan" (beri nama ic_grid_layout) dan "daftar tampilan" (beri nama ic_linear_layout). Jika Anda perlu mengingat cara menambahkan ikon material, lihat petunjuk di halaman ini.

5a01fc03113ac399.png

  1. Anda juga memerlukan suatu cara untuk memberi tahu sistem tentang opsi yang ditampilkan di panel aplikasi dan ikon yang digunakan. Untuk melakukannya, tambahkan file resource baru dengan mengklik kanan folder res dan memilih New > Android Resource File. Setel Resource type ke Menu dan File name ke layout_menu.

c4f83806a1aa121b.png

  1. Klik OK.
  2. Buka res/Menu/layout_menu. Ganti konten layout_menu.xml dengan konten berikut:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item android:id="@+id/action_switch_layout"
       android:title="@string/action_switch_layout"
       android:icon="@drawable/ic_linear_layout"
       app:showAsAction="always" />
</menu>

Struktur file menu tersebut cukup sederhana. Sama seperti tata letak yang dimulai dengan pengelola tata letak untuk menyimpan tampilan individu, file xml menu dimulai dengan tag menu yang berisi opsi individual.

Menu Anda hanya memiliki satu tombol, tetapi memiliki beberapa properti:

  • id: Seperti tampilan, opsi menu memiliki ID sehingga dapat dirujuk dalam kode.
  • title: Dalam kasus Anda, teks ini tidak akan benar-benar terlihat, tetapi mungkin berguna bagi pembaca layar untuk mengidentifikasi menu
  • icon: Properti default-nya adalah ic_linear_layout. Namun, tombol ini akan diaktifkan dan dinonaktifkan untuk menampilkan ikon petak saat tombol dipilih.
  • showAsAction: Properti ini memberi tahu sistem cara menampilkan tombol. Karena disetel ke always (selalu), tombol ini akan selalu terlihat di panel aplikasi, dan tidak menjadi bagian dari menu tambahan.

Tentu saja, hanya memiliki kumpulan properti ini bukan berarti menu akan benar-benar melakukan semuanya.

Anda tetap perlu menambahkan beberapa kode di MainActivity.kt agar menu berfungsi.

9. Mengimplementasikan tombol Menu

Untuk melihat cara kerja tombol menu, ada beberapa hal yang dapat dilakukan di MainActivity.kt.

  1. Pertama, sebaiknya buat properti untuk melacak status tata letak tempat aplikasi berada. Cara ini akan memudahkan tombol beralih tata letak. Tetapkan nilai default ke true karena pengelola tata letak linear akan digunakan secara default.
private var isLinearLayoutManager = true
  1. Saat pengguna mengalihkan tombol, Anda ingin daftar item berubah menjadi petak item. Jika Anda ingat pelajaran tampilan recycler, ada banyak pengelola tata letak yang berbeda, salah satunya GridLayoutManager yang memungkinkan beberapa item di satu baris.
private fun chooseLayout() {
    if (isLinearLayoutManager) {
        recyclerView.layoutManager = LinearLayoutManager(this)
    } else {
        recyclerView.layoutManager = GridLayoutManager(this, 4)
    }
    recyclerView.adapter = LetterAdapter()
}

Di sini, Anda menggunakan pernyataan if untuk menetapkan pengelola tata letak. Selain menyetel layoutManager, kode ini juga menetapkan adaptor. LetterAdapter digunakan untuk tata letak daftar dan petak.

  1. Saat pertama kali menyiapkan menu dalam xml, Anda memberikannya ikon statis. Akan tetapi, setelah mengalihkan tata letak, Anda harus memperbarui ikon untuk mencerminkan fungsi barunya dengan beralih kembali ke tata letak daftar. Cukup setel ikon tata letak linear dan petak, dan berdasarkan tata letak, tombol akan beralih kembali saat Anda mengetuknya di lain waktu.
private fun setIcon(menuItem: MenuItem?) {
   if (menuItem == null)
       return

   // Set the drawable for the menu icon based on which LayoutManager is currently in use

   // An if-clause can be used on the right side of an assignment if all paths return a value.
   // The following code is equivalent to
   // if (isLinearLayoutManager)
   //     menu.icon = ContextCompat.getDrawable(this, R.drawable.ic_grid_layout)
   // else menu.icon = ContextCompat.getDrawable(this, R.drawable.ic_linear_layout)
   menuItem.icon =
       if (isLinearLayoutManager)
           ContextCompat.getDrawable(this, R.drawable.ic_grid_layout)
       else ContextCompat.getDrawable(this, R.drawable.ic_linear_layout)
}

Ikon ditetapkan dengan syarat berdasarkan properti isLinearLayoutManager.

Agar aplikasi benar-benar menggunakan menu tersebut, Anda perlu mengganti dua metode lainnya.

  • onCreateOptionsMenu: tempat Anda meng-inflate menu opsi dan melakukan penyiapan tambahan
  • onOptionsItemSelected: tempat Anda akan memanggil chooseLayout() saat tombol dipilih.
  1. Ganti onCreateOptionsMenu sebagai berikut:
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
   menuInflater.inflate(R.menu.layout_menu, menu)

   val layoutButton = menu?.findItem(R.id.action_switch_layout)
   // Calls code to set the icon based on the LinearLayoutManager of the RecyclerView
   setIcon(layoutButton)

   return true
}

Semuanya biasa saja di sini. Setelah meng-inflate tata letak, panggil setIcon() untuk memastikan ikon sudah benar berdasarkan tata letaknya. Metode ini akan menampilkan Boolean—Anda menampilkan true di sini karena ingin membuat menu opsi.

  1. Terapkan seperti yang ditunjukkan onOptionsItemSelected hanya dengan beberapa baris kode.
override fun onOptionsItemSelected(item: MenuItem): Boolean {
   return when (item.itemId) {
       R.id.action_switch_layout -> {
           // Sets isLinearLayoutManager (a Boolean) to the opposite value
           isLinearLayoutManager = !isLinearLayoutManager
           // Sets layout and icon
           chooseLayout()
           setIcon(item)

           return true
       }
       //  Otherwise, do nothing and use the core event handling

       // when clauses require that all possible paths be accounted for explicitly,
       //  for instance both the true and false cases if the value is a Boolean,
       //  or an else to catch all unhandled cases.
       else -> super.onOptionsItemSelected(item)
   }
}

Tata letak ini akan dipanggil setiap kali item menu diketuk sehingga Anda harus memastikan item menu mana yang diketuk. Anda menggunakan pernyataan when di atas. Jika id cocok dengan item menu action_switch_layout, Anda akan meniadakan nilai isLinearLayoutManager. Kemudian, panggil chooseLayout() dan setIcon() untuk mengupdate UI yang sesuai.

Satu hal lagi, sebelum Anda menjalankan aplikasi. Anda harus mengganti kode tersebut di onCreate() untuk memanggil metode baru karena pengelola tata letak dan adaptor sekarang ditetapkan dalam chooseLayout(). onCreate() akan terlihat seperti berikut setelah diubah.

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)

   val binding = ActivityMainBinding.inflate(layoutInflater)
   setContentView(binding.root)

   recyclerView = binding.recyclerView
   // Sets the LinearLayoutManager of the recyclerview
   chooseLayout()
}

Sekarang jalankan aplikasi dan Anda dapat beralih antara tampilan daftar dan petak menggunakan tombol menu.

10. Kode solusi

Kode solusi untuk codelab ini tersedia dalam project di bawah ini:

  1. Buka halaman repositori GitHub yang disediakan untuk project.
  2. Pastikan nama cabang cocok dengan nama cabang yang ditentukan dalam codelab. Misalnya, dalam screenshot berikut, nama cabang adalah main (utama).

1e4c0d2c081a8fd2.png

  1. Di halaman GitHub project, klik tombol Code yang akan menampilkan pop-up.

1debcf330fd04c7b.png

  1. Pada pop-up, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
  2. Temukan file di komputer Anda (mungkin di folder Downloads).
  3. Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.

Membuka project di Android Studio

  1. Mulai Android Studio.
  2. Di jendela Welcome to Android Studio, klik Open.

d8e9dbdeafe9038a.png

Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > Open.

8d1fda7396afe8e5.png

  1. Di file browser, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
  2. Klik dua kali pada folder project tersebut.
  3. Tunggu Android Studio membuka project.
  4. Klik tombol Run 8de56cba7583251f.png untuk mem-build dan menjalankan aplikasi. Pastikan aplikasi di-build seperti yang diharapkan.

11. Ringkasan

  • Intent eksplisit digunakan untuk membuka aktivitas tertentu di aplikasi Anda.
  • Intent implisit berkaitan dengan tindakan tertentu (seperti membuka link atau berbagi gambar) dan memungkinkan sistem menentukan cara melaksanakan intent.
  • Dengan opsi menu, Anda dapat menambahkan tombol dan menu ke panel aplikasi.
  • Objek pendamping menyediakan cara untuk menghubungkan konstanta yang dapat digunakan kembali dengan jenis, bukan dengan instance dari jenis itu.

Untuk menjalankan intent:

  • Dapatkan referensi untuk konteks.
  • Buat objek Intent yang memberikan aktivitas atau jenis intent (bergantung pada jenis objek, apakah eksplisit atau implisit).
  • Teruskan semua data yang diperlukan dengan memanggil putExtra().
  • Panggil startActivity() yang meneruskan objek intent.

12. Mempelajari lebih lanjut