Android SMK Coding PDF
Android SMK Coding PDF
Bismillah…
Terima kasih.
Ade Rifaldi
Penulis
BAB 1
Aplikasi Hello World
Project (aplikasi) hello world adalah aplikasi yang hanya menampilkan kalimat “Hello
World!” pada layar emulator atau device Android ketika dijalankan. Meski begitu, aplikasi hello
world merupakan aplikasi wajib nomor satu yang harus sudah pernah dibuat oleh seorang
pengembang (developer) aplikasi Android. Pada bab ini, akan dibahas bagaimana cara membuat
aplikasi hello world dimulai dengan melakukan instalasi Android Studio hingga menjalankan
aplikasi hello world tersebut pada emulator dan device Android.
Jika sudah muncul gambar seperti di atas ketika Android Studio dijalankan, itu
artinya Android Studio sudah dapat digunakan untuk mengembangkan aplikasi Android.
Penulis menggunakan Android Studio versi 3.3.2. Jika pembaca sudah memiliki Android
Studio yang terinstall pada PC yang digunakan akan tetapi dengan versi lebih rendah,
disarankan untuk melakukan update versi pada Android Studio tersebut.
3. Selanjutnya, Konfigurasi project. isi kolom name, package name, pilih save location
sesuai dengan yang diinginkan, pilih Kotlin pada language, minimum API level, dan pilih
Use AndroidX artifacts. Name, akan menjadi nama aplikasi yang muncul pada layar
device Android. Package name adalah id unik aplikasi. Save location artinya lokasi
tempat project Android akan disimpan. Pada minimum API level, pilih API 16: Android
4.1 (Jelly Bean) karena pada bab selanjutnya akan dipelajari cara mengganti font family
aplikasi dengan mudah dan fitur tersebut hanya bisa berjalan pada device dengan
Android OS versi 4.1 ke atas. Kemudian, pilih finish.
Apabila sudah muncul tampilan seperti di atas dengan progress loading yang ada di
bagian bawah aplikasi Android Studio sudah hilang, itu artinya proses setup project
aplikasi hello world sudah selesai.
1.3. Menjalankan Aplikasi Hello World
1.3.1. Menjalakan Aplikasi Hello World pada Emulator (Virtual Device)
Sebelum menjalankan aplikasi hello world. Ada hal yang perlu diperhatikan,
yaitu versi library constraint layout yang ada pada build.gradle module app. Jika
versi library constraint layout adalah 1.1.2, maka disarankan untuk melakukan
update versi terlebih dahulu menjadi 1.1.3. Hal itu, dikarenakan ada bug cukup
serius yang dapat mengakibatkan aplikasi crash ketika dijalakan.
Lihat file explorer project dan buka file build.gradle (module: app) yang
terletak di dalam direktori Gradle Sctipts.
Lakukan double klik pada file yang terblok, kemudian update script
build.gradle tersebut.
Update bagian ini:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-
jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.core:core-ktx:1.1.0-alpha03'
implementation
'androidx.constraintlayout:constraintlayout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
androidTestImplementation 'androidx.test.espresso:espresso-
core:3.1.0-alpha4'
}
Menjadi,
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-
jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation
'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-
core:3.1.1'
}
Setelah itu, klik Sync Now yang ada di pojok kanan atas pada file Gradle tersebut.
Dengan itu, akan muncul android emulator yang dapat digunakan pada AVD
manager seperti gambar berikut:
Gambar 1.14. Memlih tipe emulator device
Jika sudah terbuat emulator baru pada AVD Manager seperti pada gambar di
atas, maka selanjutnya jalankan emulator tersebut dengan menekan tombol
play pada kolom actions dan tunggu hingga emulator tersebut memunculkan
halaman home device Android pada umumnya.
5. Selanjutnya, kembali ke Project Hello World dan pilih tombol play berwarna
hijau yang ada pada menu bar Android Studio dan pilih Android Emulator
ketika muncul dialog Select Deployment Target. lalu pilih OK
Gambar 1.16. Dialog Select Deployment Target
Setelah memilih OK, maka akan terjadi proses instalasi (deployment) project
aplikasi hello world ke emulator. Tunggu beberapa saat hingga aplikasi terinstall
ke emulator.
Studio dan pilih Android device ketika muncul dialog Select Deployment
Target, lalu pilih OK. Tunggu hingga aplikasi berhasil terinstall ke device Android
yang terkoneksi dengan PC.
Terdapat beberapa mode tampilan struktur project pada Android Studio, yaitu mode:
Project, Package, Project Files, Project Source Files, dan Android. Pada bab ini, hanya akan
dibahas struktur project dengan mode tampilan default, yaitu Android karena mode tersebut
yang akan banyak digunakan ketika pengembangan aplikasi Android.
Ada dua direktori utama pada mode struktur project Android, yaitu App dan Gradle Script.
App adalah direktori yang berisi file konfigurasi, file atau class antar muka, data, dan logika bisnis
aplikasi. Sedangkan Gradle Script berisi file script konfigurasi project.
2.1. App
Terdapat beberapa direktori pada direktori app yang perlu diperhatikan, yaitu
manifest, java, dan res. Berikut akan dibahasa satu per satu tentang direktori tersebut:
2.1.1. Manifest
Manifest adalah direktori yang berisi file konfigurasi AndroidManifest.xml.
Sebuah file konfigurasi yang berisi pengaturan spesifikasi project Android seperti,
nama package, nama aplikasi, icon aplikasi, permission yang berjalan pada Aplikasi,
serta pengaturan-pengaturan lain yang diperlukan.
2.1.2. Java
Di dalam direktori dengan nama package aplikasi yang terdapat pada
direktori java, file class Kotlin (.kt) dalam project aplikasi Android diletakan. Baik itu
class antar muka, data, maupun bisnis aplikasi. Maka itu, class MainActivity pada
aplikasi hello world secara default diletakan pada direktori tersebut.
icon folder . Kemudian, pilih CUSTOM pada pilihan Theme dan klik pada kolom
Custom color. Pilih choose kemudian Next dan Finish.
Setelah itu, file icon akan masuk secara otomatis ke direktori drawable dan
dipisahkan ke dalam lima direktori berdasarkan ukuran dimensi yang dibutuhkan.
Gambar 2.7. File icon sudah masuk ke direktori drawable
File font yang sudah ditambahkan dapat langsung digunakan dengan cara mengganti font
family text Hello World pada layout main_activity.xml. Buka file main_activity.xml,
kemudian ubah size TextView dengan menambahkan property android:textSize="48dp"
agar ukuran text menjadi lebih besar. Kemudian, tambahkan property
android:fontFamily="@font/<nama_file_font>". Maka, dengan seketika font text akan
berubah.
Project Aplikasi Hello World bisa dilihat dan di-download pada tautan berikut:
https://github.com/aderifaldi/smkcoding.android.helloworld
BAB 3
Aplikasi Profil Diri
Pada bab ini, akan dibahas banyak tentang teori dan cara penggunaan dari komponen-
komponen antar muka, Activity, dan Intent lewat pembuatan aplikasi profil diri. Aplikasi tersebut
akan menampilkan halaman isian data diri (registrasi) ketika dijalankan. Kemudian aplikasi akan
melakukan perintah untuk pindah halaman ke halaman profil diri dengan menampilkan data dari
halaman registrasi, ketika pengguna selesai melakukan pengisian data.
Berikut ini adalah kode file layout (main_activity.xml) untuk membuat layout
seperti pada gambar di atas dan akan dibahas lebih detail pada keterangan
setelahnya.
activity_main.xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Registrasi"
android:textSize="19sp"
android:layout_margin="16dp"
android:textColor="#000000"
android:fontFamily="casual"
android:layout_gravity="center_horizontal"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical">
<EditText
android:id="@+id/edtName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nama"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="text"
android:imeOptions="actionNext"/>
<Spinner
android:layout_marginTop="16dp"
android:id="@+id/spinnerGender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000"/>
<EditText
android:id="@+id/edtEmail"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="textEmailAddress"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/edtTelp"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Telp."
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="number"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/edtAddress"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="120dp"
android:hint="Alamat"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="textMultiLine"
android:gravity="top"
android:imeOptions="actionDone"/>
<Button
android:id="@+id/btnSave"
android:layout_marginTop="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Simpan"/>
</LinearLayout>
</LinearLayout>
2. TextView
TextView adalah komponen View yang digunakan untuk menampilkan informasi
berupa text. Berikut adalah kegunaan dari beberapa property yang umumnya
digunakan untuk TextView:
Property Fungsi
android:text="" Mengatur tulisan yang tampil pada TextView
android:textSize="" Mengatur ukuran font TextView dengan satuan "sp"
Mengatur warna font TextView. Diisi dengan kode
android:textColor="" warna hexadesimal yang diawali dengan tanda #,
misal "#000000"
android:fontFamily="" Mengatur jenis font TextView
3. Spinner
Spinner adalah komponen View yang digunakan untuk kebutuhan menerima
input dalam bentuk pilihan. Misal, pilihan kelamin (Laki-laki atau Perempuan).
Data pilihan yang ditampilkan akan diatur pada file .kt yang menggunakan layout
activity_main.xml, dalam kasus ini adalah MainActivity.kt
4. EditText
EditText adalah komponen View yang digunakan untuk kebutuhan menerima
input dalam bentuk text. Berikut adalah beberapa property yang banyak
digunakan pada EditText:
Property Fungsi
android:hint="" Mengatur tooltip yang mucul pada EditText
sebelum disentuh
android:textColorHint="" Mengatur warna tooltip EditText. Diisi dengan
kode warna hexadesimal yang diawali dengan
tanda #, misal "#CCCCCC"
android:textColor="" Mengatur warna font pada EditText. Diisi dengan
kode warna hexadesimal yang diawali dengan
tanda #, misal "#000000"
android:inputType="" Mengatur tipe soft input keyboard ketika EditText
disentuh. Ada beberapa, tipe input di antaranya,
text, number, textPassword, dll.
android:imeOptions="" Mengatur tipe OK button pada soft input
keyboard yang muncul ketika EditText disentuh.
5. Button
Button adalah komponen View berupa button. Button dapat diberi label
dengan menggunakan property android:text=""
3.1.3. Membuat Layout Halaman Profil Diri
Halaman profil diri adalah halaman (activity) baru. Setiap halaman umumnya
berpasangan antara file layout .xml dengan file class .kt. Android Studio sudah
memberikan kemudahan untuk membuat activity baru, yaitu dengan melakukan
langkah berikut:
1. Klik kanan pada direktori app\java\<app package>, pilih New, kemudian pilih
Activity, lalu pilih Empty Activity
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imgProfile"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#EEEEEE"/>
<LinearLayout
android:layout_marginLeft="16dp"
android:layout_toRightOf="@id/imgProfile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name: "
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
<TextView
android:id="@+id/txtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Gender: "
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
<TextView
android:id="@+id/txtGender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email: "
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
<TextView
android:id="@+id/txtEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Telp.: "
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
<TextView
android:id="@+id/txtTelp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<TextView
android:layout_marginTop="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Address:"
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
<TextView
android:layout_marginTop="16dp"
android:id="@+id/txtAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"
android:textColor="#000000"
android:fontFamily="sans-serif"/>
</LinearLayout>
</ScrollView>
3. ImageView
ImageView adalah komponen view yang digunakan untuk menampilkan
gambar, baik berupa file ataupun url gambar. Jika menggunakan file, maka
property yang digunakan adalah android:src="<posisi_file>". Sedangkan jika
menggunakan url, maka akan diatur pada file .kt yang menggunakan layoutnya.
Disamping beberapa property yang sudah dijelaskan, ada beberapa property yang
umumnya digunakan oleh semua view:
Property Fungsi
android:layout_width="" Mengatur lebar view. match_parent,
fill_parent jika ingin selebar parent dan
wrap_parent jika ingin selebar isi viewnya
android:layout_height="" Mengatur tinggi view. match_parent,
fill_parent jika ingin setinggi parent dan
wrap_parent jika ingin setinggi isi viewnya
android:visibility="" Mengatur status tampil sebuah view. invisible
jika ingin tidak terlihat. visible jika ingin terlihat
gone jika ingin menghilang. Secara default, akan
terisi dengan visible jika property tersebut
tidak digunakan
android:layout_margin="" Mengatur jarak luar semua sisi sebuah view.
Diisi dengan satuan dp
android:layout_marginTop="" Mengatur jarak luar sisi atas sebuah view
android:layout_margin Mengatur jarak luar sisi bawah sebuah view
Bottom=""
setContentView(R.layout.activity_main)
edtName = findViewById(R.id.edtName)
spinnerGender = findViewById(R.id.spinnerGender)
edtEmail = findViewById(R.id.edtEmail)
edtTelp = findViewById(R.id.edtTelp)
edtAlamat = findViewById(R.id.edtAddress)
}
}
3.3.2. Menggunakan Metode Kotlin Android Extension
Dengan Kotlin Android Extension, penggunaan kode seperti pada contoh di
atas tidak perlu dilakukan. Fungsi kode di atas digantikan dengan hanya
menambahkan satu baris kode di bawah ini:
import kotlinx.android.synthetic.main.activity_main.*
btnSave.setOnClickListener { }
when{
else -> {
Toast.makeText(this,
"Navigasi ke halaman profil diri",
Toast.LENGTH_SHORT).show()
}
}
}
<resources>
<string name="app_name">MyProfileApp</string>
<string-array name="gender_list">
<item>Pilih kelamin</item>
<item>Laki-laki</item>
<item>Perempuan</item>
</string-array>
</resources>
btnSave.setOnClickListener { validasiInput() }
setDataSpinnerGender()
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_i
tem)
spinnerGender.adapter = adapter
}
4. Menambahkan validasi SpinnerGender pada fungsi validasiInput().
when{
else -> {
}
}
Kemudian execute fungsi tersebut di dalam fungsi validasiInput ketika kondisi semua
input diisi:
else -> {
intent.putExtras(bundle)
startActivity(intent)
}
3.6. Mengambil Intent Data Pada Halaman Profil Diri
Data yang dikirimkan dengan Intent dapat diambil pada halaman tujuan
(MyProfileActvity.kt). Karena, pada saat dikirimkan menggunakan Bundle, maka untuk
mengambilnya pun menggunakan Bundle dengan kode seperti di bawah ini:
Setelah itu, data akan diambil dengan menggunakan nama variable dan tipe data
sesuai dengan yang digunakan pada saat dikirim. Contoh, untuk mengambil data yang
dikirimkan dengan tipe String dan variable "nama":
txtName.text = nama
txtGender.text = gender
txtEmail.text = email
txtTelp.text = telp
txtAddress.text = alamat
Project Aplikasi Profil Diri bisa dilihat dan di-download pada tautan berikut:
https://github.com/aderifaldi/smkcoding.android.profildiri
BAB 4
Aplikasi Teman Saya
Pada bab ini akan dipelajari pembuatan aplikasi yang dapat menyimpan data teman serta
menampilkannya dalam tampilan list. Maka itu, pada bab ini akan dipelajari tentang
penyimpanan data (database) lokal, yaitu Room. Jika pada bab sebelumnya dibahas tentang
beberapa komponen ViewGroup dan View, pada bab ini hanya akan dibahas komponen View
yaitu FloatingActionButton dan RecyclerView. Pada bab ini juga akan dibahas tentang
penggunaan Fragment. Fragment adalah class yang memiliki fungsi sama seperti Activity, akan
tetapi Fragment tidak bisa berdiri sendiri. Sebuah Fragment harus bergantung pada sebuah
Activity. Dalam analogi sederhana, Fragment bisa dianggap sebuah child dan Activity adalah
parent, sebagaimana ViewGroup dan View.
implementation 'androidx.recyclerview:recyclerview:1.0.0'
Setelah melakukan penambahan library, klik Sync Now yang muncul pada
bagian kanan atas editor.
Gambar 4.1. Pesan Yang Muncul Setelah Dilakukan Perubahan Pada File Grdale
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/listMyFriends"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical">
<EditText
android:id="@+id/edtName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nama"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="text"
android:imeOptions="actionDone"/>
<Spinner
android:layout_marginTop="16dp"
android:id="@+id/spinnerGender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:entries="@array/gender_list"/>
<EditText
android:id="@+id/edtEmail"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="textEmailAddress"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/edtTelp"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Telp."
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="number"
android:imeOptions="actionNext"/>
<EditText
android:id="@+id/edtAddress"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="120dp"
android:hint="Alamat"
android:textColorHint="#CCCCCC"
android:textColor="#000000"
android:inputType="textMultiLine"
android:gravity="top"
android:imeOptions="actionDone"/>
<Button
android:id="@+id/btnSave"
android:layout_marginTop="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Simpan"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="8dp"
android: paddingBottom="8dp">
<TextView
android:id="@+id/txtFriendName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nama"
android:textSize="18sp"/>
<TextView
android:id="@+id/txtFriendEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email"
android:textSize="16sp"/>
<TextView
android:layout_marginTop="4dp"
android:id="@+id/txtFriendTelp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Telp"
android:textSize="20sp"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#000000"/>
</LinearLayout>
dependencies
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/listMyFriends"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.google.android.material.floatingactionbutton.FloatingActionButt
on
android:id="@+id/fabAddFriend"
style="@style/Widget.Design.FloatingActionButton"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add_plus_button"/>
</RelativeLayout>
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Pada aplikasi GOJEK di atas, terdapat lima Fragment (Home, Orders, Help, Inbox,
Account) yang ditampilkan dalam satu Activity. Pada project aplikasi MyFriendApp, akan
digunakan penerapan yang serupa, yaitu menggunakan dua Fragment
(MyFriendsFragment.kt dan MyFriendsAddFragment.kt) pada satu Activity
(MainActivity.kt)
4.2.1. Menambahkan Fragment MyFriendsFragment.kt
Berikut adalah langkah-langkah untuk menambahkan file .kt pada project:
1. Klik kanan pada direktori app/java/<package project>
2. Pilih New, Kotlin File/Class
3. Beri nama MyFriendsFragment dan pilih Kind: Class, OK
MyFriendsFragment.kt
package id.smkcoding.myfriendapp
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.*
companion object {
fun newInstance(): MyFriendsFragment {
return MyFriendsFragment()
}
}
package id.smkcoding.myfriendapp
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.*
companion object {
fun newInstance(): MyFriendsAddFragment {
return MyFriendsAddFragment()
}
}
}
4.3. Menambahkan Fungsi gantiFragment() pada Aplikasi MyFriendApp
Fungsi gantiFragment() adalah fungsi yang digunakan untuk mengganti Fragment
yang tampil pada MainActivity.kt. Berikut adalah kode MainActivity.kt setelah ditambahkan
fungsi gantiFragment()
package id.smkcoding.myfriendapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
transaction.commit()
}
fun tampilMyFriendsFragment() {
gantiFragment(supportFragmentManager,
MyFriendsFragment.newInstance(), R.id.contentFrame)
}
fun tampilMyFriendsAddFragment(){
gantiFragment(supportFragmentManager,
MyFriendsAddFragment.newInstance(), R.id.contentFrame)
}
fabAddFriend.setOnClickListener { (activity as
MainActivity).tampilMyFriendsAddFragment() }
4.3.2. Menjalankan fungsi tampilMyFriendsFragment pada MyFriendsAddFragment
Fungsi tampilMyFriendsFragment pada MyFriendsAddFragment dijalankan
ketika Button Save pada MyFriendsAddFragment diklik. Ditambahkan pada fungsi
initView():
btnSave.setOnClickListener { (activity as
MainActivity).tampilMyFriendsFragment() }
androidExtensions {
experimental = true
}
MyFriendAdapter.kt
package id.smkcoding.myfriendapp
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.my_friends_item.*
ViewHolder(LayoutInflater.from(context).inflate(R.layout.my_friends_
item, parent, false))
override fun onBindViewHolder(holder: ViewHolder, position: Int)
{
holder.bindItem(items.get(position))
}
}
}
}
3. Menampilkan data listTeman ke dalam RecyclerView
simulasiDataTeman()
tampilTeman()
}
….
implementation 'android.arch.persistence.room:runtime:1.1.1'
kapt 'android.arch.persistence.room:compiler:1.1.1'
@Entity
data class MyFriend (
@PrimaryKey(autoGenerate = true)
val temanId: Int? = null,
val nama : String,
val kelamin : String,
val email : String,
val telp: String,
val alamat: String
)
4.5.3. Membuat Data Access Object (DAO) Untuk Menambah dan Mengambil Data
Teman
Sebuah database berbasis table memerlukan sekumpulan perintah khusus
untuk mengakses data yang disebut dengan SQL (Structured Query Language). Pada
database Room, perlu dibuat sebuah interface berisi SQL yang disebut DAO. Sebuah
DAO dapat diisi dengan perintah SQL untuk menambahkan (insert), mengubah
(update), menghapus (delete), dan mengambil (get) data.
MyFriendDao.kt
@Dao
interface MyFriendDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun tambahTeman(friend: MyFriend)
companion object {
var INSTANCE: AppDatabase? = null
fun destroyDataBase(){
INSTANCE = null
}
}
}
4.5.5. Membuat Fungsi tambahDataTeman(teman: MyFriend)
Perintah menambah data teman dijalankan pada Fragment
MyFriendsAddFragment.kt ketika Button btnSave ditekan dan fungsi validasiInput()
memasuki kondisi validasi sukses. Untuk menlajankan perintah tambah (insert)
teman yang ada pada MyFriendDao.kt, dibutuhkan penggunaan coroutines. Maka
itu perlu ditambahkan library coroutines pada build.gradle. Kemudian, Sync.
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
else -> {
return GlobalScope.launch {
myFriendDao?.tambahTeman(teman)
(activity as MainActivity).tampilMyFriendsFragment()
}
MyFriendsAddFragment.kt
package id.smkcoding.myfriendapp
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.my_friends_add_fragment.*
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
companion object {
fun newInstance(): MyFriendsAddFragment {
return MyFriendsAddFragment()
}
}
setDataSpinnerGener()
}
adapter.setDropDownViewResource(android.R.layout.simple_spinner_drop
down_item)
spinnerGender.adapter = adapter
}
when{
namaInput.isEmpty() -> edtName.error = "Nama tidak boleh
kosong"
genderInput.equals("Pilih kelamin") ->
tampilToast("Kelamin harus dipilih")
emailInput.isEmpty() -> edtEmail.error = "Email tidak
boleh kosong"
telpInput.isEmpty() -> edtTelp.error = "Telp tidak boleh
kosong"
alamatInput.isEmpty() -> edtAddress.error = "Alamat
tidak boleh kosong"
else -> {
}
}
return GlobalScope.launch {
myFriendDao?.tambahTeman(teman)
(activity as MainActivity).tampilMyFriendsFragment()
}
}
4.6. Mengambil Data Teman Dari Database Lokal
Perlu dilakukan beberapa perubahan pada class MyFriendsFragment.kt untuk
mengambil data list teman dari database lokal, diantaranya yaitu: mengganti tiper variable
listTeman dari MutableList menjadi List, menambahkan global variable AppDatabase dan
MyFriendDao, inisialisasi AppDatabase dan MyFriendDao, dan membuat fungsi untuk
mengambil (get) data teman.
MyFriendsFragment.kt
package id.smkcoding.myfriendapp
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.my_friends_fragment.*
companion object {
fun newInstance(): MyFriendsFragment {
return MyFriendsFragment()
}
}
ambilDataTeman()
}
listTeman = ArrayList()
myFriendDao?.ambilSemuaTeman()?.observe(this, Observer { r ->
listTeman = r
when {
listTeman?.size == 0 -> tampilToast("Belum ada data
teman")
else -> {
tampilTeman()
}
})
Project Aplikasi MyFriendsApp bisa dilihat dan di-download pada tautan berikut:
https://github.com/aderifaldi/smkcoding.android.myfriendsapp
BAB 5
Aplikasi Pengguna Github
Pada bab ini akan dipelajari cara pembuatan aplikasi yang menampilkan data dari sebuah
web service/API (Application Programming Interface). API adalah sebuah program yang dibuat
sebagai penghubung antara database dengan aplikasi lain agar bisa saling berkomunikasi untuk
melakukan pengambilan, pengiriman, perubahan, atau penghapusan data lewat sebuat jaringan
baik itu intranet maupun internet. Komunikasi yang dilakukan antara aplikasi dengan database
melalui sebuah API, umumnya harus mengikuti aturan (protocol) yang dibuat pada saat
pembuatan API tersebut. Hal itu lah apa yang disebut dengan dokumentasi API.
Aplikasi yang dibuat pada bab ini akan menggunakan API Github yang dapat dilihat
dokumetasinya pada tautan berikut https://developer.github.com/v3/. Tetapi, hanya akan
digunakan API get user (pengguna), yaitu: https://api.github.com/users. Aplikasi akan berjalan
dengan melakukan pengambilan data pengguna Github dengan API tersebut lewat jaringan
internet. Kemudian respon API akan ditampilan dalam tampilan list.
<uses-permission android:name="android.permission.INTERNET"/>
//GSON
implementation 'com.google.code.gson:gson:2.8.2'
//NETWORK
implementation 'com.squareup.okhttp3:okhttp:3.13.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
//GLIDE
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
[
{
"login": "mojombo",
"id": 1,
"node_id": "MDQ6VXNlcjE=",
"avatar_url": "https://avatars0.githubusercontent.com/u/1?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mojombo",
"html_url": "https://github.com/mojombo",
"followers_url":
"https://api.github.com/users/mojombo/followers",
"following_url":
"https://api.github.com/users/mojombo/following{/other_user}",
"gists_url":
"https://api.github.com/users/mojombo/gists{/gist_id}",
"starred_url":
"https://api.github.com/users/mojombo/starred{/owner}{/repo}",
"subscriptions_url":
"https://api.github.com/users/mojombo/subscriptions",
"organizations_url":
"https://api.github.com/users/mojombo/orgs",
"repos_url": "https://api.github.com/users/mojombo/repos",
"events_url":
"https://api.github.com/users/mojombo/events{/privacy}",
"received_events_url":
"https://api.github.com/users/mojombo/received_events",
"type": "User",
"site_admin": false
}, …
]
Respon API tersebut perlu direpresentasikan menjadi Data Class. Untuk mempermudah
melakukan hal itu, diperlukan bantuan plugin yang bernama JSON to Kotlin Class. Berikut
adalah langkah-langkah untuk menambahkan plugin pada Android Studio:
1. Pilih menu File – Settings – Plugins
2. Pilih Browse repositories – tulis "json to kotlin", Instal dan Restart Android Studio
5.4. Melakukan
5.5. …
Gambar 5. Applikasi Github User
Project Aplikasi GithubUserApp bisa dilihat dan di-download pada tautan berikut:
https://github.com/aderifaldi/smkcoding.android.githubuserapp
Firebase
Kita akan coba 2 fitur dari firebase nya yaitu Authentication dan Cloud messaging
1. Firebase authentication
adalah layanan yang diberikan oleh Firebase untuk fungsi user membership. Fitur-fitur
yang diberikan adalah register / login dengan beberapa metode :
– Alamat email dan password.
– Akun Google.
– Akun Facebook.
– Akun Twitter.
– Akun GitHub.
– Akun Anonymous.
Fitur yang menarik adalah fitur login dengan akun anonymous. Contohnya adalah user bisa
melakukan login secara sementara ketika melihat-lihat barang di aplikasi online shop kita.
Nah ketika user ingin melakukan pembelian, maka user tersebut diharuskan untuk login
dengan salah satu metode yang didukung Firebase (email-password, Google, Facebook,
Twitter, GitHub). Setelah user tersebut login, kita bisa mengumpulkan data-data yang dilihat
oleh user tersebut ketika masih menggunakan akun anonymous, kemudian
menggabungkannya dengan user yang sekarang telah login dengan salah satu metode login
yang dipilih.
2. Firebase Cloud Messaging
FCM merupakan transformasi dari GCM (Google Cloud Messaging) dengan berbagai
pengembangan yang lebih powerful. Bagaimana cara kerja dari FCM tersebut? FCM
memiliki 2 komponen utama untuk mengirim dan menerima pesan.
- Firebase Cloud Functions atau server aplikasi untuk menyiapkan,
menargetkan, dan mengirim pesan.
- Sebuah aplikasi klien (Android, iOS, atau Web) untuk menerima pesan.
3. Kemudian buka website firebase nya di https://firebase.google.com/ lalu pilih get started
4. Add project dan tulis nama project nya dengan nama AuthAndMessaging, kemudian
create project
5. Kalau sudah maka akan muncul tampilan seperti ini, dan kita pilih “Add firebase to
your android app”
6. Kemudian kita isi field-field dibawah ini
package="auth.edu.dycode.com.authandmessaging"
- SHA 1 Bisa kita dapatkan dengan cara buka gradle yang ada di sebelah kanan
7. Buka lagi web firebase nya dan masukan field-field yang isinya sudah kita dapatkan.
10. Tambahkan firebase SDK ke project kita, setelah ditambahkan lalu pilih next
Sehingga menjadi seperti ini
Gradle > Module:app
Disini saya juga menambahkan sdk untuk authentication, cloud messaging glide dan
butterknife
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-core:16.0.1'
implementation 'com.google.firebase:firebase-auth:16.0.2'
implementation 'com.google.android.gms:play-services-auth:15.0.1'
implementation 'com.google.firebase:firebase-messaging:17.1.0'
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
apply plugin: 'com.google.gms.google-services'
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/prof_section"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<ImageView
android:layout_width="90dp"
android:layout_height="wrap_content"
android:id="@+id/img_profile"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="28dp"
android:layout_marginTop="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Nama"
android:id="@+id/txt_name"
android:textSize="25sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Email"
android:id="@+id/txt_email"
android:textSize="25sp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Sign Out"
android:id="@+id/btn_sign_out"/>
</LinearLayout>
</LinearLayout>
<com.google.android.gms.common.SignInButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_login"
android:layout_marginTop="20dp">
</com.google.android.gms.common.SignInButton>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/prof_section"
android:orientation="horizontal"
android:layout_marginTop="30dp">
<ImageView
android:layout_width="90dp"
android:layout_height="wrap_content"
android:id="@+id/img_profile"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="28dp"
android:layout_marginTop="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Nama"
android:id="@+id/txt_name"
android:textSize="25sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Email"
android:id="@+id/txt_email"
android:textSize="25sp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Sign Out"
android:id="@+id/btn_sign_out"/>
</LinearLayout>
</LinearLayout>
<com.google.android.gms.common.SignInButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_login"
android:layout_marginTop="20dp">
</com.google.android.gms.common.SignInButton>
</LinearLayout>
private static final int REQ_CODE = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
profSection.setVisibility(View.GONE);
mAuth = FirebaseAuth.getInstance();
}
};
@OnClick(R.id.btn_sign_out)
public void onBtnSignOutClicked() {
signOut();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
if (task.isSuccessful()) {
FirebaseUser firebaseUser = mAuth.getCurrentUser();
txtName.setText(firebaseUser.getDisplayName());
txtEmail.setText(firebaseUser.getEmail());
Glide.with(MainActivity.this).load(firebaseUser.getPhotoUrl().toString()).into(imgProfile);
updateUI(true);
} else {
updateUI(false);
}
}
});
} else {
Toast.makeText(this, "failed", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_CODE) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleResult(result);
}
}
@OnClick(R.id.btn_login)
public void onViewClicked() {
signIn();
}
}
15. Yang terakhir kita harus manambahkan permission internet di project kita, buka
AndroidManifest.xml dan tambahkan seperti ini
<uses-permission android:name="android.permission.INTERNET"/>
16. Kalo sudah Coba running aplikasi nya, dan ini hasil aplikasi nya
Menambahkaan Push Notification dengan Firebase Cloud Messaging(FCM)
Kita masih menggunakan project yang ini, di project ini kita coba menambahkan fitur
FCM,
package com.example.authandmessaging
import com.google.firebase.iid.FirebaseInstanceId
import com.google.firebase.iid.FirebaseInstanceIdService
val refreshedToken =
FirebaseInstanceId.getInstance().instanceId
}
}
18. MyFirebaseMessagingService.kt
package com.example.authandmessaging
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.media.RingtoneManager
import android.net.Uri
import android.support.v4.app.NotificationCompat
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent: PendingIntent = PendingIntent
.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT)
.setContentText(message).setAutoCancel(true).setSound(soundUri)
.setContentIntent(pendingIntent)
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
notificationManager.notify(0, notificationBuilder.build())
}
}
20. Sampai sini kita sudah membuat code untuk FCM, coba running kembali aplikasi nya
untuk mencoba notifikasi nya, kita buka console firebase dan pilih menu Grow -> Cloud
Messaging -> send your first message
21. Test notifikasi nya, dan tulis contoh pesan ke user, kemudian send message
22. Jika berhasil, maka akan tampil notifikasi seperti ini
Referensi
Android Studio
https://developer.android.com/studio
https://developer.android.com/studio/install
Kotlin
https://kotlinlang.org/docs/reference/android-overview.html
https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
Android Spinner
https://tutorial.eyehunts.com/android/android-spinner-with-example-in-kotlin/
AndroidX
https://developer.android.com/jetpack/androidx/migrate
Github API
https://developer.github.com/v3/
OkHttp
https://square.github.io/okhttp/
Retrofit
https://square.github.io/retrofit/
Glide
https://github.com/bumptech/glide
Bug fixing
https://stackoverflow.com/questions/49512629/android-studio-error-default-interface-
methods-are-only-supported-starting-with