Special for Wonderkoding
ANDROID
TRAINING
Ceritakan nama, asal, pengalaman dan
ekspektasi kamu mengikuti training ini
HITHERE!
Senin Activity, Intent, ListView
Selasa RecyclerView, Layout, Localization
rabu Fragment, Menu, Navigation
kamis Background Thread, JSON, Get API
jum’at ViewModel, Testing
OURTarget
PERSIAPAN
● Android Studio v3.4 ke atas
● JDK (Java Development Kit)
● Smartphone/Emulator
Android
studio
ANDROID STUDIO REQUIREMENT
● OS : Windows, Mac, Linux
● Ram min 4 Gb, 8 Gb recommended
● Available Disk 2 Gb, 4 Gb recommended
● Resolution : 1280 x 800
“The master has failed more times
than the beginner has even tried.”
—SOMEONEFAMOUS
Caramenjalankan aplikasi
- Virtual Device from Android Studio
- Emulator (Memu, Nox, Genymotion, Bluestack)
- Langsung di device
- Enable Your Developer Option First
(Setting > About Phone > Tap 7 times in Build
Number)
- Enable USB Debugging
PengenalanANDROID STUDIO
Untuk mengatur permission,
activity, dan launcher.
Untuk menulis kode
Untuk menulis UI Testing
Untuk menulis Unit Testing
PengenalanANDROID STUDIO
Untuk resource gambar
Untuk resource layout
Untuk resource icon aplikasi
Untuk resource warna
Untuk resource teks
Untuk resource styles
PengenalanANDROID STUDIO
Untuk library level project
Untuk library level App,
mengganti min SDK dan
version code
ACtivity
AlurACTIVITY
Codelab 1:
aPLIKASI
MENGHITUNG
VOLUME
Desain denganLINEarLAYOUT
Padding vsmargin
AmbilDATA
MenampilkanDATA
val volume = inputLength.toDouble() * inputWidth.toDouble()
* inputHeight.toDouble()
tvResult.text = volume.toString()
val inputLength = edtLength.text.toString().trim()
val inputWidth = edtWidth.text.toString().trim()
val inputHeight = edtHeight.text.toString().trim()
Cobalahrotate Aplikasi
Apayangterjadi?
Saatconfigurationchanges
Datanyahilangalias
Tidakterjaga.Lalu
Bagaimanamengatasinya?
onsaveinstancestate
JAWABANNYA
save instancestate
Showinstancestate
val inputLength = edtLength.text.toString().trim()
val inputWidth = edtWidth.text.toString().trim()
val inputHeight = edtHeight.text.toString().trim()
Membuatactivitybaru
konsepRelativelayout
konsepRelativelayout
Linearlayout vsRelativelayout
Harus berurutan
Atas ke bawah (vertikal) atau
Kiri ke kanan (horizontal)
Boleh Bebas
di mana saja
(tidak harus urut)
Desain detaildenganRelativelayout
intent
INTENT
kirimDATAviaintent
TERIMADATA
logGING
Untuk menampilkan nilai di Logcat
debugGING
Untuk menampilkan nilai secara bertahap
Untuk Resume
KONSTANTA
Supaya aman karena
nilainya pasti sama
listview
Codelab 2:
aPLIKASIlist
pahlawan
Listviewdenganarray adapter
LALUBAGAIMANA CARANYAJIKA
DATANYAkompleks SEPERTIINI?
CUSTOMADAPTER
JAWABANNYA
KONSEP customadapter
Data class/kelasmodel
klik kanan pada package utama → New → Kotlin Class.
Beri nama Hero.
Desain layoutitem
klik kanan pada direktori layout → new → layout
resource file dan kemudian beri nama item_hero.xml.
Membuatadapter
● Extend ke BaseAdapter
● Implement method getCount(), geItem(), getItemId, dan getView()
Intiadapter
● Menghubungkan adapter dengan layout item
● Menyesuaikan data ke masing-masing komponen
Persiapan data source
● Tambahakan foto pahlawan ke drawable
● Tambahkan data ke values/strings.xml
Penerapan adapter
Inisialisasi sesuai constructor,
set data, dan
pasang ke ListView
onitemClickpadalistview
Buat activity baru terlebih dahulu dengan cara
klik kanan pada package utama → New → Activity →
ScrollingActivity. Beri nama DetailActivity.
parcelable
Mengirimdata individual
Kita sudah belajar cara mengirim data dengan intent sebelumnya,
yang kalau diimplementasikan hasilnya seperti ini:
● Kirim data di MainActivity
● Terima data di DetailActivity
LALUBAGAIMANA CARANYA
JIKAPROPERTIDATANYAadaBANYAK?20?100?
2000?
Pastibakalsangatpanjangkan?
parcelable
JAWABANNYA
Menambahkanparcelable pada data class
● Pastikan dulu di dalam build.gradle (module: app)
● Tambahkan anotasi @Parcelize dan Parcelable di data class Hero
Mengirimdata denganparcelable
● Kirim data di MainActivity
● Terima data di DetailActivity
Menambahkankomponendidetail
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="360dp"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:toolbarId="@+id/toolbar">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:id="@+id/imgDetailPhoto"
/>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay" />
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".DetailActivity"
tools:showIn="@layout/activity_detail">
<TextView
android:id="@+id/tvDetailDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:text="@string/large_text" />
</androidx.core.widget.NestedScrollView>
● Tambah id di
content_detail.xml
● Tambah ImageView di
activity_detail.xml
Menampilkandatadidetail
Submission
1
constraint
layout
Buatactivitydetailbaru
Buat activity baru terlebih dahulu dengan cara
klik kanan pada package utama → New → Activity →
EmptyActivity. Beri nama ConstraintDetailActivity.
Detaillistdenganconstraint layout
SCROLlVIEW
MembuatdanMenggunakanstyle
<TextView
android:id="@+id/tvNameDetail"
style="@style/TitleText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Sudirman"
/>
<TextView
android:id="@+id/txt_name"
style="@style/TitleText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="26dp"
android:layout_toEndOf="@id/img_photo"
android:text="@string/name_heroes" />
● activity_constraint_detail.xml● Style di item_hero.xml
Mengganticolortheme
● Values > colors.xml
● Referensi warna bisa lihat di
https://www.materialpalette.com
Menggantiicon
● Klik kanan pada
mipmap > new >
Image Asset
● Pilih logo di
bagian Path
● Buat logo mudah
di canva.com
Recycler
view
Konseprecyclerview
Kelebihanrecyclerview
Tidak langsung membuat semua list, tapi menggunakan lagi
item yang lama. Sehingga menjadi lebih efisien
Kelebihanrecyclerview
Ada LayoutManager yang dapat merubah jenis tampilan hanya
dengan 1 baris kode
LinearLayoutManager GridLayoutManager StaggeredLayoutManager
Menambahkan library
● Masuk ke build.gradle (module:app), tambahkan di dalam
dependencies, kemudian Sync Now
Menggantilistviewjadi recyclerview
● Ubah di activity_main.xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Menambahkancardview
● Ubah di item_hero.xml
Membuatadapter untukrecyclerview
● Ubah di activity_main.xml
class HeroAdapter internal constructor(private val context:
Context) : RecyclerView.Adapter<HeroAdapter.ListViewHolder> {
Fungsimasing-masingmethod
RecyclerViewAdapter
ListView Adapter
Hasil akhir RecyclerViewAdapter
Lho?Direcyclerviewtidakadaonitemclick?
LALUBAGAIMANA CARANYA?
buatdidalamadapter
JAWABANNYA
Onclickdidalamadapter
fun bind(hero: Hero) {
with(itemView){
txt_name.text = hero.name
txt_description.text = hero.description
img_photo.setImageResource(hero.photo)
itemView.setOnClickListener {
val intentDetail = Intent(context, ConstraintDetailActivity::class.java)
val selectedHero = hero
intentDetail.putExtra(ConstraintDetailActivity.KEY_HERO, selectedHero)
context.startActivity(intentDetail)
}
}
}
Di sini memerlukan context karena kita tidak di Activity, tapi di
dalam Adapter. Kita perlu context karena yg berpindah bukan
Adapter-nya, tapi Activity-nya
WajiBada Layout manager
rv_list.layoutManager =
LinearLayoutManager(this)
rv_list.layoutManager =
GridLayoutManager(this, 2)
Fragment&
Navigation
fragment bersifat Modular
● Satu Activity bisa berisi banyak Fragment (ex: Activity B)
● Satu Fragment bisa dipakai di banyak Activity (ex: Fragment A)
Codelab 3:
Bottom
navigation
Template bottom navigation
Buatfragment baru
klik kanan package utama Anda → pilih new → Fragment → Fragment(Blank) → masukan nama fragment tersebut dan
lakukan uncheck pada include fragment factory methods dan include interface callbacks → selanjutnya pilih Finish
Tambahiconbaru
klik kanan pada folder drawable → pilih new → pilih Vector Asset. Kemudian pada Clip Art cari icon dengan nama
account_circle. Lalu Klik Next dan Finish.
Menambahkanfragment kebuttomnavigation
bottom_nav_menu.xml
mobile_navigation.xml
Konfigurasiappbarotomatis
Merubahactivityjadifragment
Secara umum kode antara Activity dan Fragment sama,
yang berbeda hanya di bagian ini:
● OnCreate >> onViewCreated
● Context this >> activity
Option
menu
Membuatmenu
● klik kanan pada res → new → android resource directory dan namai "menu" untuk membuat folder menu. Klik Finish
● klik kanan pada menu → new → android resource file → main_menu.xml dan klik Finish
Menampilkanmenudiactivity
Menampilkanmenudiactivity
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="?actionBarSize"
android:padding="@dimen/appbar_padding"
android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary" />
</com.google.android.material.appbar.AppBarLayout>
<activity
android:name=".MenuActivity"
android:label="@string/title_activity_menu"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
localization
Membuatmulti-language
Masuk ke res → values →strings.xml kemudian klik Open editor
Menambahkanbahasa
Memanggilsettingbahasa
Submission
1I
Jsonapi
Mendaftar keopenweather api
● Daftar ke http://openweathermap.org/ dan dapatkan API KEY
mencobaopenweather api
● Coba buka
https://api.openweathermap.org/data/2.5/weather?q=Bandung&appid=YOUR_API_KEY
● Supaya rapi gunakan extension JSON FORMATTER di Google Chrome
Jsonobject danjsonarray
● JSON Array yang
ditandai dengan
tanda kurung siku /
"[]"
● JSON Object yang
ditandai dengan
kurung kurawal / "{}"
Json parsing
Ambildatadeskripsi
Ambildatatemperature
loopj
Codelab 4:
Getdata from
jsonapi
Menambahkanlibrary loopj
● Masuk ke build.gradle (module:app), tambahkan di dalam
dependencies, kemudian Sync Now
Buatlayout item
weatheradapter.kt
class WeatherAdapter internal constructor(private val context: Context) : RecyclerView.Adapter<WeatherAdapter.ListViewHolder>()
{
internal var listData = arrayListOf<WeatherItems>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
//untuk menghubungkan dengan layout item
val itemView = LayoutInflater.from(context).inflate(R.layout.weather_items, parent, false)
val viewHolder = ListViewHolder(itemView)
return viewHolder
}
override fun getItemCount(): Int {
//untuk jumlah item yang ditampilkan
return listData.size
}
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
//memberi data ke ViewHolder sesuai posisinya
val hero = listData[position]
holder.bind(hero)
}
class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
//mencocokkan data dengan komponen
fun bind(weatherItems: WeatherItems) {
with(itemView){
textKota.text = weatherItems.name
textTemp.text = weatherItems.temperature
textDesc.text = weatherItems.description
}
}
}
}
adapter = WeatherAdapter(this)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
mainactivity.kt
Caramengunakanloopj
Parsing jsonketikaberhasil
Parsing jsonketikaberhasil
Menambahkanpermission internet
Parsing jsonketikaberhasil
Cobalahrotate Aplikasi
Apayangterjadi?
Saatconfigurationchanges
Datanyahilangalias
Tidakterjaga.Lalu
Bagaimanamengatasinya?
viewmodel
JAWABANNYA
View
model
Buatmainviewmodel
Inisialisasiviewmodeldanobserve data
Submission
1iI
CREDITS: This presentation template was created by
Slidesgo, including icons by Flaticon, and
infographics & images by Freepik.
THANKSDoes anyone have any questions?
Ahmad Arif Faizin
Dimas Maulana
dicoding.com
Please keep this slide for attribution.

Training Android Wonderkoding

Editor's Notes

  • #32 https://github.com/arifaizin/WonderKoding1-Activity-and-Intent/compare/master...Intent
  • #44 https://github.com/arifaizin/Wonderkoding2-ListView-and-RecyclerView/compare/master...customadapter
  • #51 https://github.com/arifaizin/Wonderkoding2-ListView-and-RecyclerView/compare/customadapter...parcelable
  • #57 https://github.com/arifaizin/Wonderkoding2-ListView-and-RecyclerView/compare/parcelable...constraintlayout
  • #59 https://github.com/arifaizin/Wonderkoding2-ListView-and-RecyclerView/compare/constraintlayout...styleandtheme
  • #73 https://github.com/arifaizin/Wonderkoding2-ListView-and-RecyclerView/compare/styleandtheme...recyclerview
  • #85 https://github.com/arifaizin/WonderKoding3-Navigation-and-Menu/compare/master...optionmenu
  • #86 https://github.com/arifaizin/WonderKoding3-Navigation-and-Menu/compare/master...optionmenu
  • #91 https://github.com/arifaizin/WonderKoding3-Navigation-and-Menu/compare/optionmenu...localization
  • #95 93a3696714297ee5a9f65486aa8cb824
  • #96 93a3696714297ee5a9f65486aa8cb824
  • #97 93a3696714297ee5a9f65486aa8cb824
  • #103 93a3696714297ee5a9f65486aa8cb824
  • #104 https://api.openweathermap.org/data/2.5/group?id=1642911,1650357,1627896&appid=93a3696714297ee5a9f65486aa8cb824
  • #105 https://api.openweathermap.org/data/2.5/group?id=1642911,1650357,1627896&appid=93a3696714297ee5a9f65486aa8cb824
  • #107 https://api.openweathermap.org/data/2.5/group?id=1642911,1650357,1627896&appid=93a3696714297ee5a9f65486aa8cb824
  • #110 https://api.openweathermap.org/data/2.5/group?id=1642911,1650357,1627896&appid=93a3696714297ee5a9f65486aa8cb824
  • #111 https://api.openweathermap.org/data/2.5/group?id=1642911,1650357,1627896&appid=93a3696714297ee5a9f65486aa8cb824