Anda di halaman 1dari 74

Modul Praktikum Android

Versi 2 (PHP, MYSQL, ANDROID)

Muharir, M.Kom 1117019401

UNIVERSITAS ISLAM KALIMANTAN MUHAMMAD


ARSYAD AL-BANJARI BANJARMASIN FAKULTAS
TEKNOLOGI INFORMASI
2019
DAFTAR ISI

DAFTAR ISI .....................................................................................................................................


BAB I PERSIAPAN DAN TOOLS ................................................................................................ 1
1.1 PERSIAPAN ........................................................................................................................... 1
Java dan XML ........................................................................................................................ 1
Query Mysql dan PHP ......................................................................................................... 1
JSON........................................................................................................................................ 1
1.2 Tools ...................................................................................................................................... 1
Java JDK 8+ ............................................................................................................................ 1
Android Studio ..................................................................................................................... 1
XAMPP ................................................................................................................................... 2
Emulator ............................................................................................................................... 2
BAB II DATABASE DAN MEMPERSIAPKAN APLIKASI SERVER ........................................ 4
2.1 Database dan tabel............................................................................................................ 4
Table transaksi .................................................................................................................... 4
2.2 Menyiapkan Server .......................................................................................................... 4
Membuat File Koneksi ....................................................................................................... 4
Membuat File List (Daftar Item) ...................................................................................... 5
Membuat File Tambah Data ............................................................................................. 6
Membuat File Update Data ............................................................................................... 6
Membuat File Delete Data .................................................................................................7
Membuat File Cari Data (filter) .........................................................................................7
BAB III MEMBUAT LAYOUT APLIKASI .................................................................................. 9
3.1 Membuat Project Aplikasi ............................................................................................... 9
3.2 Menambahkan Dependency dan Plugin ..................................................................... 11
3.3 Membuat SplashScreen ................................................................................................. 12
3.4 Membuat Tampilan List Data ....................................................................................... 15
3.5 Membuat Tampilan Add Data ....................................................................................... 21
3.6 Membuat Tampilan Edit Data...................................................................................... 24
3.7 Membuat List Menu Edit Dan Hapus ......................................................................... 27
3.8 Membuat Tampilan Pencarian Data........................................................................... 28
BAB IV MENAMBAHKAN BEHAVIOR PADA ACTIVITY ..................................................... 31
4.1 Menambahkan Kelas Helper .......................................................................................... 31
4.2 Menampilkan Data Pada List View ............................................................................. 33
4.3 Simpan Data Ke Mysql................................................................................................... 39
4.4 Edit Data ........................................................................................................................... 42
4.5 Hapus Data....................................................................................................................... 48
4.6 Pencarian Data ................................................................................................................ 50
BAB V MEMPERCANTIK TAMPILAN DENGAN INTRO ALA APLIKASI TOKOPEDIA . 64
5.1 Mempercantik Dengan IntroApp ................................................................................. 64
5.2 Tampilan Akhir Aplikasi................................................................................................. 67
DAFTAR PUSTAKA .................................................................................................................... 70
BAB I
PERSIAPAN DAN TOOLS
1.1 PERSIAPAN

Java dan XML


Ada beberapa hal yang perlu disiapkan untuk membuat aplikasi android diantaranya
anda diwajibkan telah memahami bahasa pemrograman Java karena bahasa yang
digunakan untuk membuat aplikasi android adalah Java dan XML.

Query Mysql dan PHP


Memahami query Mysql dan Bahasa Pemrograman Server Side seperti PHP, ini
sebenarnya tidak wajib, namun pada praktikum kali ini kita akan menggunakan
database Mysql sebagai media penyimpanan datanya. Sedangkan PHP digunakan
untuk mengambil data yang ada pada database. Karena android tidak bisa langsung
berkomunikasi dengan mysql secara langsung.

JSON
Sebuah format untuk berbagi data. Seperti dapat kita lihat dari namanya, JSON
diturunkan dari bahasa pemrograman javaScript, akan tetapi format ini tersedia bagi
banyak bahasa lain termasuk Python, Ruby, PHP, dan Java. Json kita gunakan untuk
pertukaran data antara android dan php.

1.2 Tools

Java JDK 8+
JDK yang digunakan adalah jdk versi 8 atau yang lebih tinggi agar kompatibel dengan
android studio. Bagi yang belum mengetahui apa itu JDK, jdk adalah Java
Development Kit atau yang biasa disingkat JDK merupakan Software yang digunakan
untuk melakukan proses kompilasi dari Java Code ke bytecode.
Pada dasarnya Aplikasi Android ini dikembangkan menggunakan bahasa
pemrograman Java. Oleh karena itu JDK menjadi sangat penting untuk diinstall ketika
kita ingin membangun aplikasi Android. Java jdk dapat di download pada link dibawah
ini :
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-
5066655.html

Android Studio
Android Studio adalah Lingkungan Pengembangan Terpadu Integrated Development
Environment (IDE) untuk pengembangan aplikasi Android, berdasarkan IntelliJ IDEA.
Selain merupakan editor kode IntelliJ dan alat pengembang yang berdaya guna,
1
Android Studio menawarkan fitur lebih banyak untuk meningkatkan produktivitas
saat membuat aplikasi Android, misalnya:

• Sistem versi berbasis Gradle yang fleksibel


• Emulator yang cepat dan kaya fitur
• Lingkungan yang menyatu untuk pengembangan bagi semua perangkat Android
• Instant Run untuk mendorong perubahan ke aplikasi yang berjalan tanpa
membuat APK baru
• Template kode dan integrasi GitHub untuk membuat fitur aplikasi yang sama dan
mengimpor kode contoh
• Alat pengujian dan kerangka kerja yang ekstensif
• Alat Lint untuk meningkatkan kinerja, kegunaan, kompatibilitas versi, dan
masalah-masalah lain
• Dukungan C++ dan NDK
• Dukungan bawaan untuk Google Cloud Platform, mempermudah pengintegrasi-
an Google Cloud Messaging dan App Engine.

XAMPP
Xampp adalah paket aplikasi yang di dalamnya terdapat Mysql, Apache, PHP dan
software yang lainnya. Kita akan menggunakan Xampp agar dapat menyelesaikan
project dengan cepat dan tidak menginstall secara terpisah agar tidak banyak
konfigurasi tambahan yang harus dibuat.

Emulator
Emulator adalah device simulasi yang digunakan untuk testing aplikasi maupun
debug. Emulator yang digunakan pada praktikum ini adalah GenyMotion,
genymotion adalah emulator standar yang sering digunakan para developer untuk
mendebug dan test aplikasi mereka. Genymotion bisa di unduh pada link berikut
https://www.genymotion.com/
Namun ada solusi lain jika computer kita tidak mencukupi dari segi RAM. Yaitu
dengan menggunakan handphone kita sebagai sarana debug dan test. Namun ada
beberapa langkah yang harus dilakukan

• Nyalakan mode developer Settings -> About Phone -> Ketuk 5 Kali Cepat
pada Build Number sampai ada notifikasi “You Are Already a Developer”
• Aktifkan USB Debugging pada menu Developer Options

2
3
BAB II
DATABASE DAN MEMPERSIAPKAN APLIKASI SERVER

2.1 Database dan tabel


Buatlah database dengan nama uangkas dan buat table transaksi dengan struktur
seperti berikut :

Table transaksi

Cukup hanya 1 tabel saja, nanti kita akan mengolahnya sedemikan rupa agar
meghasilkan data-data yang variative di table transaksi.

2.2 Menyiapkan Server


Buat folder (project baru) pada xampp/htdocs dengan nama uangkas dan
tambahkan file-file seperti berikut :

Membuat File Koneksi


connection.php

<?php

define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','uangkas');
$conn = mysqli_connect(HOST,USER,PASS,DB) or die('Unable to Connect');

date_default_timezone_set("Asia/Jakarta");
?>

4
Membuat File List (Daftar Item)
list.php

<?php
require_once('connection.php');

$query = mysqli_query($conn,
"SELECT * FROM transaksi ORDER BY transaksi_id DESC"
);

$result = array();
while($row = mysqli_fetch_array($query)){
array_push($result,array(
'transaksi_id' => $row['transaksi_id'],
'status' => $row['status'],
'jumlah' => $row['jumlah'],
'keterangan' => $row['keterangan'],
'tanggal' => date("d/m/Y", strtotime($row['tanggal'])),
'tanggal2' => $row['tanggal']
));
}

$query = mysqli_query($conn,
"SELECT (SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK') AS
masuk, (SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR') AS
keluar"
);

while ($row = mysqli_fetch_assoc($query)) {

$masuk = $row['masuk'];
$keluar = $row['keluar'];

echo json_encode(array(
'masuk' => $masuk,
'keluar' => $keluar,
'saldo' => ($masuk - $keluar),
'result' => $result
));

mysqli_close($conn);

5
?>

Membuat File Tambah Data


add.php

<?php
require_once('connection.php');

$status = $_REQUEST['status'];
$jumlah = $_REQUEST['jumlah'];
$keterangan = $_REQUEST['keterangan'];
$tanggal = date('Y-m-d');

// insert comment
$query = mysqli_query($conn, "INSERT INTO transaksi (status, jumlah,
keterangan, tanggal) VALUES ('$status', '$jumlah', '$keterangan',
'$tanggal') ");

if($query) {
echo json_encode(array( 'response'=>'success' ));
} else {
echo json_encode(array( 'response'=>'failed' ));
}
?>

Membuat File Update Data


update.php

<?php
require_once('connection.php');

$transaksi_id = $_REQUEST['transaksi_id'];
$status = $_REQUEST['status'];
$jumlah = $_REQUEST['jumlah'];
$keterangan = $_REQUEST['keterangan'];
$tanggal = $_REQUEST['tanggal'];

// update content
$sql = "UPDATE transaksi SET status = '$status', jumlah='$jumlah',
keterangan='$keterangan', tanggal='$tanggal' WHERE
transaksi_id='$transaksi_id'";
$query = mysqli_query($conn, $sql );

6
if($query) {
echo json_encode(array( 'response'=>'success' ));
} else {
echo json_encode(array( 'response'=>'failed' ));
}
?>

Membuat File Delete Data


delete.php

<?php
require_once('connection.php');

$transaksi_id = $_REQUEST['transaksi_id'];

// delete
$query = mysqli_query($conn, "DELETE FROM transaksi WHERE
transaksi_id='$transaksi_id' ");

if($query) {
echo json_encode(array( 'response'=>'success' ));
} else {
echo json_encode(array( 'response'=>'failed' ));
}
?>

Membuat File Cari Data (filter)


filter.php

<?php
require_once('connection.php');

$from = $_REQUEST['from'];
$to = $_REQUEST['to'];
$sql = "SELECT * FROM transaksi WHERE (tanggal >= '$from') AND (tanggal
<= '$to') ORDER BY transaksi_id DESC";
//echo $sql; die();

$query = mysqli_query($conn, $sql );

7
$result = array();
while($row = mysqli_fetch_array($query)){
array_push($result,array(
'transaksi_id' => $row['transaksi_id'],
'status' => $row['status'],
'jumlah' => $row['jumlah'],
'keterangan' => $row['keterangan'],
'tanggal' => date("d/m/Y", strtotime($row['tanggal'])),
'tanggal2' => $row['tanggal']
));
}

$sql =
"SELECT
(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK' AND (tanggal >=
'$from') AND (tanggal <= '$to') ) AS masuk,
(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR' AND (tanggal >=
'$from') AND (tanggal <= '$to')) AS keluar";
//echo $sql;die();
$query = mysqli_query($conn, $sql );

while ($row = mysqli_fetch_assoc($query)) {

$masuk = $row['masuk'];
$keluar = $row['keluar'];

echo json_encode(array(
'masuk' => $masuk,
'keluar' => $keluar,
'saldo' => ($masuk - $keluar),
'result' => $result
));

mysqli_close($conn);

?>

8
BAB III
MEMBUAT LAYOUT APLIKASI

3.1 Membuat Project Aplikasi


Buat project baru Start a New Android Studio Project – Basic Activity

Next – dan Setting seperti berikut :

9
Jika terjadi kesalahan Error Gradle saat membuat project seperti dibawah ini, maka
pastikan anda terkoneksi ke internet dan resolve kesalahan yang terjadi.

Lihat gambar di bawah ini untuk resolve.

Setelah Klik Try Again, tunggu hingga proses resolve selesai. Jika berhasil maka
akan tampil seperti berikut :

10
Dan Design Viewnya pun muncul

Sip.

3.2 Menambahkan Dependency dan Plugin


Ada beberapa plugin dan dependency yang akan kita tambahkan untuk membuat
aplikasi agar semakin baik dari segi tampilan maupun kemudahan koding.

• Gradle Script – build.gradle (Project: UangKas) seperti berikut :


allprojects {
repositories {
google()
jcenter()

11
maven { url 'https://jitpack.io' }

}
}

Hanya yang di tulis bold yang ditambahkan.

• Gradle Script – build.gradle (Module: app) seperti berikut :

dependencies {
……
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
implementation 'com.amitshekhar.android:android-networking:1.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.patrickpissurno:ripple-effect:1.3.1'
implementation 'com.github.dmytrodanylyk.shadow-layout:library:1.0.3'
implementation 'com.jakewharton:butterknife:8.8.0'
implementation 'com.leavjenn.smoothdaterangepicker:library:0.2.0'
implementation 'com.github.AppIntro:AppIntro:4.2.3'

……
}
Hanya yang di tulis bold yang ditambahkan.

3.3 Membuat SplashScreen


Tambahkan Activity Baru dengan nama SplashScreen dengan cara

App – Klik Kanan – New – Activity – Empty Activity

12
Activity Name : SplashScreen dan conteng Generate Layout File. Klik Finish.

Pada praktikum ini sudah diberikan asset splashsreen, drag asset rupiah_coin.png
ke folder drawable pada android studio anda, sehingga akan terlihat seperti berikut
pada Project Tree :

Ingat !!! letakkan pada drawable bukan drawable(v24)

13
Pada activity_splash_screen.xml buat menjadi seperti berikut :

activity_splash_screen.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".SplashScreen">

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/rupiah_coin"/>

</LinearLayout>
SplashScreen.java
package muharir17.github.uangkas;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class SplashScreen extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);

Thread timerThread = new Thread(){


public void run(){
try{
sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}finally{
startActivity(new Intent(SplashScreen.this,
MainActivity.class));
}
}
};
timerThread.start();
}

@Override
protected void onPause() {
super.onPause();
finish();
}

14
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="muharir17.github.uangkas">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".SplashScreen"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.NoActionBar">
</activity>
</application>

</manifest>

Tukar posisi antara .MainActivity dan .SplashScreen. Perlu diketahui bahwa


Manifest file ini mengatur aplikasi kita untuk terhubung dengan device seperti
camera, bluetoth, Maps, dan Internet. Jika sudah selesai anda bisa mencobanya
dengan menjalankan aplikasi pada emulator atau handphone anda.

3.4 Membuat Tampilan List Data


Pada content_main.xml ubah menjadi seperti berikut :

content_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"

15
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
android:orientation="vertical"
tools:showIn="@layout/activity_main">

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PEMASUKAN"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:id="@+id/text_masuk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="90.000"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_masuk"
android:text="PENGELUARAN"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:id="@+id/text_keluar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/text_masuk"
android:text="40.000"
android:textStyle="bold"
android:textSize="16dp"/>
<View
android:id="@+id/view_garis"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"

16
android:layout_below="@+id/text_keluar"
android:background="#999"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/view_garis"
android:text="SALDO"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:id="@+id/text_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/view_garis"
android:layout_alignParentRight="true"
android:text="130.000"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:visibility="gone"
android:id="@+id/text_filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/text_total"
android:textSize="10dp"
android:text="SEMUA"
android:textAlignment="center"/>
</RelativeLayout>
</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/list_kas"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
</android.support.v7.widget.CardView>

17
</LinearLayout>

Gambar di samping adalah hasil render layout yang


kita buat pada content_main.xml sebelumnya.

Lihat pada icon amplop pada kanan bawah, kita akan


menggantinya dengan icon add agar sesuai dengan
fungsinya yaitu menambah data.

Buka icon_add.zip dan extrak semua foldernya ke


directory project UangKas\app\src\main\res.

Pada activity_main.xml ubah pada tag FloatingActionButton menjadi seperti


berikut :

activity_main.xml
……………………………………………………..
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@mipmap/icon_add" />
…………………………………………………..

Seharusnya sekarang tampilan icon sudah berubah menjadi tampilan icon yang baru
kita tambahkan.

18
Tambahkan layout baru dengan nama list_kas.xml dengan cara klik kanan pada
project - New – XML – Layout XML File – list_kas.xml

Pada list_kas.xml buat menjadi seperti berikut

list_kas.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">

<TextView
android:visibility="gone"
android:id="@+id/text_transaksi_id"

19
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/text_jumlah"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="100.000"
android:textStyle="bold"
android:textSize="16dp"/>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<TextView
android:id="@+id/text_keterangan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/text_status"
android:text="Membeli pulsa"/>

<TextView
android:id="@+id/text_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="KELUAR"
android:textSize="12dp"
android:textStyle="bold"/>
</RelativeLayout>

<TextView
android:id="@+id/text_tanggal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="20 Feb 2017"
android:textSize="10dp"/>
<TextView
android:id="@+id/text_tanggal2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>

</LinearLayout>

20
3.5 Membuat Tampilan Add Data
Untuk membuat tampilan tambah data, tambahkanlah Activity Baru (Empty Activity)
dengan nama AddActivity.

activity_add.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical"
tools:context=".AddActivity">

<android.support.v7.widget.CardView
android:layout_width="match_parent"

21
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<RadioGroup
android:id="@+id/radio_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radio_masuk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MASUK"/>
<RadioButton
android:id="@+id/radio_keluar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="KELUAR"/>
</RadioGroup>
</LinearLayout>
</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">

<EditText
android:id="@+id/edit_jumlah"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="Rp. "/>
<EditText
android:id="@+id/edit_keterangan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="5"
android:maxLines="10"
android:gravity="top|left"
android:hint="Keterangan"/>
</LinearLayout>

22
</android.support.v7.widget.CardView>

<com.andexert.library.RippleView
android:id="@+id/rip_simpan"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.dd.ShadowLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:sl_shadowRadius="5dp">
<Button
android:id="@+id/btn_simpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="SIMPAN"/>
</com.dd.ShadowLayout>
</com.andexert.library.RippleView>

</LinearLayout>

Jika kita preview pada tab Design maka akan terlihat seperti berikut :

Baik untuk membuatnya bisa diakses ubah kode pada MainActivity.java

23
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

Ubah menjadi seperti berikut :


fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,
AddActivity.class));
}
});

Jalankan Pada emulator atau handphone anda, klik icon Add, apakah sudah berpindah
ke AddActivity, jika iya maka anda sudah berhasil menampilkan AddActivity dengan
benar.

3.6 Membuat Tampilan Edit Data


Untuk membuat tampilan Edit data, tambahkanlah Activity Baru (Empty Activity)
dengan nama EditActivity.

activity_edit.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical"
tools:context=".EditActivity">

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"

24
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<RadioGroup
android:id="@+id/radio_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radio_masuk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MASUK"/>
<RadioButton
android:id="@+id/radio_keluar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="KELUAR"/>
</RadioGroup>
</LinearLayout>
</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">

<EditText
android:id="@+id/edit_jumlah"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="Rp. "/>
<EditText
android:id="@+id/edit_keterangan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="5"
android:maxLines="10"
android:gravity="top|left"
android:hint="Keterangan"/>
<EditText
android:id="@+id/edit_tanggal"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"

25
android:hint="Tanggal"/>
</LinearLayout>
</android.support.v7.widget.CardView>

<com.andexert.library.RippleView
android:id="@+id/rip_simpan"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.dd.ShadowLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:sl_shadowRadius="5dp">
<Button
android:id="@+id/btn_simpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="SIMPAN PERUBAHAN"/>
</com.dd.ShadowLayout>
</com.andexert.library.RippleView>
</LinearLayout>

Jika kita lihat pada designer maka terlihat seperti berikut :

26
3.7 Membuat List Menu Edit Dan Hapus
Kita akan membuat menu edit dan hapus pada list view yang ada di activity_main
dengan menambahkan layout baru dengan nama list_menu.xml, cara
pembuatannya seperti pada membuat list_kas.xml, isi dari file list_menu.xml adalah
seperti berikut

list_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<com.andexert.library.RippleView
android:id="@+id/rip_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Edit"/>
</com.andexert.library.RippleView>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="#999"/>
<com.andexert.library.RippleView
android:id="@+id/rip_hapus"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text_hapus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Hapus"/>
</com.andexert.library.RippleView>

</LinearLayout>

27
3.8 Membuat Tampilan Pencarian Data
Untuk membuat tampilan pencarian data kita akan memodifikasi menu terlebih
dahulu, pertama buka res -> menu_main.xml dan ubah menjadi seperti berikut :

menu_main.xml
<menu 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"
tools:context="muharir17.github.uangkas.MainActivity">
<item
android:id="@+id/action_filter"
android:orderInCategory="100"
android:title="Cari Data"
app:showAsAction="never" />
</menu>

Buat activity baru dengan nama FilterActivity, pada activity_filter.xml buat


menjadi seperti berikut :

activity_filter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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=".FilterActivity"
android:orientation="vertical">

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"

28
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<EditText
android:id="@+id/edit_dari"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Dari"/>
<EditText
android:id="@+id/edit_ke"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Sampai"/>
</LinearLayout>
</android.support.v7.widget.CardView>

<com.andexert.library.RippleView
android:id="@+id/rip_filter"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.dd.ShadowLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:sl_shadowRadius="5dp">
<Button
android:id="@+id/btn_filter"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="FILTER"/>
</com.dd.ShadowLayout>
</com.andexert.library.RippleView>

</LinearLayout>

Setelah itu ubah isi method public boolean onOptionsItemSelected pada


MainActivity.java menjadi seperti berikut :

MainActivity.java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.action_filter) {
startActivity(new Intent(MainActivity.this,
FilterActivity.class));

29
return true;
}
return super.onOptionsItemSelected(item);
}

30
BAB IV
MENAMBAHKAN BEHAVIOR PADA ACTIVITY

4.1 Menambahkan Kelas Helper


Karena kita akan mengkoneksikan Aplikasi kita dengan database Mysql maka
pertama buatlah package dengan nama helper.

Tambahkan 1 buah kelas Java dengan nama Config.java, isi dari config.java adalah
sebagai berikut :

31
Config.java
package muharir17.github.uangkas.helper;

public class Config {


public static String host = "http://192.168.42.236/uangkas/";
}

Ip diatas di dapatkan saat tethering USB dari handphone ke laptop/computer, setiap


handpone punya ip yang berbeda jadi anda bisa mengeceknya dengan menggunakan
perintah ipconfig pada command prompt. Dan cek pada tulisan Ethernet Adapter.

Tambahkan kelas baru kembali pada package helper dengan nama CurrentDate.java
kelas ini digunakan untuk mendapatkan tanggal saat ini untuk berikutnya mengubah
sesuai format tanggal Indonesia.

CurrentDate.java
package muharir17.github.uangkas.helper;

import java.util.Calendar;

public class CurrentDate {


public static Calendar calendar = Calendar.getInstance();
public static int year = calendar.get(Calendar.YEAR);
// current year
public static int month = calendar.get(Calendar.MONTH);
// current month
public static int day =
calendar.get(Calendar.DAY_OF_MONTH); // current day
}

32
4.2 Menampilkan Data Pada List View
Tambahkan inisialisasi Object di bawah deklarasi kelas seperti berikut :
public class MainActivity extends AppCompatActivity {

TextView text_masuk, text_keluar, text_total;


ListView list_kas;
SwipeRefreshLayout swipe_refresh;
ArrayList<HashMap<String, String>> aruskas = new ArrayList<HashMap<String, String>>();

public static TextView text_filter;


public static String LINK, transaksi_id, status, jumlah, keterangan, tanggal, tanggal2,
tgl_dari, tgl_ke;
public static boolean filter;

String query_kas, query_total;

@Override
protected void onCreate(Bundle savedInstanceState) {
……………………………………………………………………………………….
}
……………………………………………………………………………………………….
}

Buat procedure Adapter untuk ListView, ini adalah tempat kita menampilkan semua transaksi data.

MainActivity.java
private void Adapter(){
SimpleAdapter simpleAdapter = new SimpleAdapter(this, aruskas, R.layout.list_kas,
new String[] { "transaksi_id", "status", "jumlah", "keterangan", "tanggal", "tanggal2"},
new int[] {R.id.text_transaksi_id, R.id.text_status, R.id.text_jumlah, R.id.text_keterangan,

33
R.id.text_tanggal, R.id.text_tanggal2});

list_kas.setAdapter(simpleAdapter);
list_kas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
transaksi_id = ((TextView) view.findViewById(R.id.text_transaksi_id)).getText().toString();
status = ((TextView) view.findViewById(R.id.text_status)).getText().toString();
jumlah = ((TextView) view.findViewById(R.id.text_jumlah)).getText().toString();
keterangan = ((TextView) view.findViewById(R.id.text_keterangan)).getText().toString();
tanggal = ((TextView) view.findViewById(R.id.text_tanggal)).getText().toString();
tanggal2 = ((TextView) view.findViewById(R.id.text_tanggal2)).getText().toString();

}
});

swipe_refresh.setRefreshing(false);
}

Buat kembali procedure KasAdapter pada MainActivity.java


MainActivity.java
private void KasAdapter(){

swipe_refresh.setRefreshing(true);
aruskas.clear(); list_kas.setAdapter(null);

Log.d("link", LINK );
AndroidNetworking.post( LINK )
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response

NumberFormat rupiahFormat = NumberFormat.getInstance(Locale.GERMANY);

34
text_masuk.setText(
rupiahFormat.format(response.optDouble("masuk")));
text_keluar.setText(
rupiahFormat.format( response.optDouble("keluar") ));
text_total.setText(
rupiahFormat.format( response.optDouble("saldo") ));

try {
JSONArray jsonArray = response.optJSONArray("result");
for (int i = 0; i < jsonArray.length(); i++) {

JSONObject responses = jsonArray.getJSONObject(i);


HashMap<String, String> map = new HashMap<String, String>();

map.put("transaksi_id", responses.optString("transaksi_id"));
map.put("status", responses.optString("status"));
map.put("jumlah", responses.optString("jumlah"));
map.put("keterangan", responses.optString("keterangan"));
map.put("tanggal", responses.optString("tanggal"));
map.put("tanggal2", responses.optString("tanggal2"));

aruskas.add(map);
}

Adapter();

} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError error) {
// handle error
}
});
}

35
Override Methode OnResume dan tambahkan kode seperti berikut didalamnya :
public void onResume(){
super.onResume();

query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi ORDER BY transaksi_id
DESC";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK') AS masuk, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR') AS keluar " +
"FROM transaksi";

if (filter) {

query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi " +
"WHERE (tanggal >= '" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "')
ORDER BY transaksi_id ASC ";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK' AND (tanggal >= '" +
tgl_dari + "') AND (tanggal <= '" + tgl_ke + "') ), " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR' AND (tanggal >= '"
+ tgl_dari + "') AND (tanggal <= '" + tgl_ke + "')) " +
"FROM transaksi " +
"WHERE (tanggal >= '" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "') ";

LINK = Config.host + "filter.php?from=" + tgl_dari + "&to=" + tgl_ke;


filter = false;
}
KasAdapter();

36
Pada Methode OnCreate ubah menjadi seperti berikut :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

LINK = Config.host + "list.php";


transaksi_id = ""; status = ""; jumlah = ""; keterangan = ""; tanggal = ""; tanggal2 = "";
tgl_dari = ""; tgl_ke = ""; query_kas = ""; query_total = ""; filter = false;

text_filter = (TextView) findViewById(R.id.text_filter);


text_masuk = (TextView) findViewById(R.id.text_masuk);
text_keluar = (TextView) findViewById(R.id.text_keluar);
text_total = (TextView) findViewById(R.id.text_total);
list_kas = (ListView) findViewById(R.id.list_kas);
swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);

swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi ORDER BY
transaksi_id DESC";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK') AS masuk, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR') AS keluar " +
"FROM transaksi";
LINK = Config.host + "list.php";
KasAdapter();
text_filter.setVisibility(View.GONE);
}
});

FloatingActionButton fab = findViewById(R.id.fab);


fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

37
startActivity(new Intent(MainActivity.this, AddActivity.class));
}
});
}

Agar device kita bisa mengakses internet kita perlu menambahkan Permission_internet pada AndroidManifest.xml
menjadi seperti berikut, ingat tag ini diletakkan didalam tag <manifest> bukan di dalam tag :

AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />

Jika Sudah anda bisa menjalankannya, jika berhasil akan tampil seperti berikut :

38
4.3 Simpan Data Ke Mysql
Pada poin ini kita akan membuat tambah datanya, langkah awal adalah menambahkan kode seperti berikut pada
AddActivity.java

AddActivity.java
package muharir17.github.uangkas;

import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.andexert.library.RippleView;
import com.androidnetworking.AndroidNetworking;
import com.androidnetworking.common.Priority;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONObjectRequestListener;

import org.json.JSONObject;

import muharir17.github.uangkas.helper.Config;

public class AddActivity extends AppCompatActivity {


RadioGroup radio_status;
EditText edit_jumlah, edit_keterangan;
Button btn_simpan;
RippleView rip_simpan;

String status;

39
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);

status = "";

radio_status = (RadioGroup) findViewById(R.id.radio_status);


edit_jumlah = (EditText) findViewById(R.id.edit_jumlah);
edit_keterangan = (EditText) findViewById(R.id.edit_keterangan);
btn_simpan = (Button) findViewById(R.id.btn_simpan);
rip_simpan = (RippleView) findViewById(R.id.rip_simpan);

radio_status.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
switch(checkedId){
case R.id.radio_masuk:
status = "MASUK";
break;
case R.id.radio_keluar:
status = "KELUAR";
break;
}

Log.d("Log status", status);


}
});

btn_simpan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});

rip_simpan.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override

40
public void onComplete(RippleView rippleView) {
if (status.equals("") || edit_jumlah.getText().toString().equals("")){
Toast.makeText(getApplicationContext(), "Isi data dengan benar",
Toast.LENGTH_LONG).show();
} else {

_save();
}
}
});

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Tambah");
}

@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}

private void _save(){


AndroidNetworking.post( Config.host + "add.php")
.addBodyParameter("status", status)
.addBodyParameter("jumlah", edit_jumlah.getText().toString())
.addBodyParameter("keterangan", edit_keterangan.getText().toString())
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response

Log.d("response", response.toString() );

if (response.optString("response").toString().equals("success")){
Toast.makeText(getApplicationContext(), "Berhasil disimpan",

41
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Gagal",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError error) {
// handle error
}
});
}
}

4.4 Edit Data


Untuk menambahkan edit data terlebih dahulu tambahkan procedure ListMenu yang berfungsi untuk menampilkan
menu edit dan delete saat menekan ListView pada MainActivity.
MainActivity.java
private void ListMenu(){

final Dialog dialog = new Dialog(MainActivity.this);


dialog.setContentView(R.layout.list_menu);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT);

TextView text_edit = (TextView) dialog.findViewById(R.id.text_edit);


TextView text_hapus = (TextView) dialog.findViewById(R.id.text_hapus);
dialog.show();

text_edit.setOnClickListener(new View.OnClickListener() {
@Override

42
public void onClick(View v) {
dialog.dismiss();
startActivity(new Intent(MainActivity.this, EditActivity.class));
}
});
text_hapus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();

Hapus();
}
});
}

Panggil Procedure tersebut pada Procedure Adapter seperti berikut :


private void Adapter(){
……………………………………………………………………………………………………………………………………………………………………………………..
list_kas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
…………………………………………………………………………………………………………………………………………………………………………………………………..
ListMenu();
}
});

swipe_refresh.setRefreshing(false);
}

Setelah itu pada EditActivity.java tambahkan kode seperti berikut :


package muharir17.github.uangkas;

43
import android.app.DatePickerDialog;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.andexert.library.RippleView;
import com.androidnetworking.AndroidNetworking;
import com.androidnetworking.common.Priority;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONObjectRequestListener;

import org.json.JSONObject;

import java.text.DecimalFormat;
import java.text.NumberFormat;

import muharir17.github.uangkas.helper.Config;
import muharir17.github.uangkas.helper.CurrentDate;

public class EditActivity extends AppCompatActivity {

MainActivity M = new MainActivity();

RadioGroup radio_status;
RadioButton radio_masuk, radio_keluar;

EditText edit_jumlah, edit_keterangan, edit_tanggal;


Button btn_simpan;
RippleView rip_simpan;

44
String status, tanggal;

DatePickerDialog datePickerDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);

status = ""; tanggal = "";

radio_status = (RadioGroup) findViewById(R.id.radio_status);


radio_masuk = (RadioButton) findViewById(R.id.radio_masuk);
radio_keluar = (RadioButton) findViewById(R.id.radio_keluar);

edit_jumlah = (EditText) findViewById(R.id.edit_jumlah);


edit_keterangan = (EditText) findViewById(R.id.edit_keterangan);
edit_tanggal = (EditText) findViewById(R.id.edit_tanggal);
btn_simpan = (Button) findViewById(R.id.btn_simpan);
rip_simpan = (RippleView) findViewById(R.id.rip_simpan);

Detail();

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Edit");
}

@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}

private void Detail(){

status = M.status;

45
switch (M.status){
case "MASUK":
radio_masuk.setChecked(true); break;
case "KELUAR":
radio_keluar.setChecked(true); break;
}

radio_status.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
switch(checkedId){
case R.id.radio_masuk:
status = "MASUK";
break;
case R.id.radio_keluar:
status = "KELUAR";
break;
}

Log.d("Log status", status);


}
});

edit_jumlah.setText( M.jumlah );
edit_keterangan.setText( M.keterangan );

tanggal = M.tanggal2;
edit_tanggal.setText( M.tanggal );

edit_tanggal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePickerDialog = new DatePickerDialog(EditActivity.this, new
DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month_of_year, int
day_of_month) {

46
// set day of month , month and year value in the edit text
NumberFormat numberFormat = new DecimalFormat("00");
tanggal = year + "-" + numberFormat.format(( month_of_year +1 )) + "-" +
numberFormat.format(day_of_month);
edit_tanggal.setText(numberFormat.format(day_of_month) + "/" +
numberFormat.format(( month_of_year +1 )) +
"/" + year );
}
}, CurrentDate.year, CurrentDate.month, CurrentDate.day);
datePickerDialog.show();
}
});

rip_simpan.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
if (status.equals("") || edit_jumlah.getText().toString().equals("")){
Toast.makeText(getApplicationContext(), "Isi data dengan benar",
Toast.LENGTH_LONG).show();
} else {

AndroidNetworking.post( Config.host + "update.php")


.addBodyParameter("transaksi_id", M.transaksi_id)
.addBodyParameter("status", status)
.addBodyParameter("jumlah", edit_jumlah.getText().toString())
.addBodyParameter("keterangan",
edit_keterangan.getText().toString())
.addBodyParameter("tanggal", tanggal)
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
Log.d("response", response.toString() );

if (response.optString("response").equals("success")){

47
Toast.makeText(getApplicationContext(), "Perubahan
berhasil disimpan",
Toast.LENGTH_LONG).show();
finish();
} else {
Toast.makeText(getApplicationContext(), "Gagal",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError error) {
// handle error
}
});
}
}
});

}
}

4.5 Hapus Data


Tambahkan procedure pada MainActivity.java seperti berikut :
private void Hapus(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Konfirmasi");
builder.setMessage("Yakin untuk mengahapus transaksi ini?");
builder.setPositiveButton(
"Yes",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();

AndroidNetworking.post( Config.host + "delete.php")

48
.addBodyParameter("transaksi_id", transaksi_id)
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
if
(response.optString("response").toString().equals("success")){
Toast.makeText(getApplicationContext(), "Data berhasil
dihapus",
Toast.LENGTH_LONG).show();

KasAdapter();

} else {
Toast.makeText(getApplicationContext(), "Gagal",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError error) {
// handle error
}
});

}
});

builder.setNegativeButton(
"No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});

49
builder.show();
}

4.6 Pencarian Data


Untuk pencarian data pada file FilterActivity.java buat menjadi seperti berikut :

FilterActivity.java
package muharir17.github.uangkas;

import android.app.DatePickerDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;

import com.andexert.library.RippleView;

import java.text.DecimalFormat;
import java.text.NumberFormat;

import muharir17.github.uangkas.helper.CurrentDate;

public class FilterActivity extends AppCompatActivity {

MainActivity M = new MainActivity();

EditText edit_dari, edit_ke;


Button btn_filter;
RippleView rip_filter;

50
DatePickerDialog datePickerDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter);

edit_dari = (EditText) findViewById(R.id.edit_dari);


edit_ke = (EditText) findViewById(R.id.edit_ke);
btn_filter = (Button) findViewById(R.id.btn_filter);
rip_filter = (RippleView) findViewById(R.id.rip_filter);

edit_dari.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePickerDialog = new DatePickerDialog(FilterActivity.this, new
DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month_of_year, int
day_of_month) {
NumberFormat numberFormat = new DecimalFormat("00");
M.tgl_dari = year + "-" + numberFormat.format(month_of_year + 1) + "-" +
numberFormat.format(day_of_month);
edit_dari.setText(numberFormat.format(day_of_month) + "/" +
numberFormat.format(month_of_year + 1) +
"/" + year);
}
}, CurrentDate.year, CurrentDate.month, CurrentDate.day);
datePickerDialog.show();
}
});

edit_ke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePickerDialog = new DatePickerDialog(FilterActivity.this, new
DatePickerDialog.OnDateSetListener() {

51
@Override
public void onDateSet(DatePicker view, int year, int month_of_year, int
day_of_month) {
NumberFormat numberFormat = new DecimalFormat("00");
M.tgl_ke = year + "-" + numberFormat.format(month_of_year + 1) + "-" +
numberFormat.format(day_of_month);
edit_ke.setText(numberFormat.format(day_of_month) + "/" +
numberFormat.format(month_of_year + 1) +
"/" + year);
}
}, CurrentDate.year, CurrentDate.month, CurrentDate.day);
datePickerDialog.show();
}
});

rip_filter.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
if (edit_dari.getText().toString().equals("") ||
edit_ke.getText().toString().equals("")){
Toast.makeText(getApplicationContext(), "Isi data dengan benar",
Toast.LENGTH_LONG).show();
} else {
M.filter = true;
M.text_filter.setText( edit_dari.getText().toString() + " - " +
edit_ke.getText().toString() );
M.text_filter.setVisibility(View.VISIBLE);

finish();
}
}
});

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Atur Tanggal");

52
@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}
}

Setelah itu pada MainActivity.java tambahkan method (procedure) dengan nama _filterMysql()

MainActivity.java
private void _filterMysql(){
SmoothDateRangePickerFragment smoothDateRangePickerFragment =
SmoothDateRangePickerFragment
.newInstance(new SmoothDateRangePickerFragment.OnDateRangeSetListener() {
@Override
public void onDateRangeSet(SmoothDateRangePickerFragment view,
int yearStart, int monthStart,
int dayStart, int yearEnd,
int monthEnd, int dayEnd) {
String date = "You picked the following date range: \n"
+ "From " + dayStart + "/" + (++monthStart)
+ "/" + yearStart + " To " + dayEnd + "/"
+ (++monthEnd) + "/" + yearEnd;
Log.d("daterange_result", date);

tgl_dari = yearStart + "-" + monthStart + "-" + dayStart ;


tgl_ke = yearEnd + "-" + monthEnd + "-" + dayEnd ;
LINK = Config.host + "filter.php?from=" + tgl_dari + "&to=" + tgl_ke;

text_filter.setVisibility(View.VISIBLE);
text_filter.setText(
dayStart + "/" + monthStart + "/" + yearStart + " - " +
dayStart + "/" + monthStart + "/" + yearStart
);

53
KasAdapter();
}
});
smoothDateRangePickerFragment.show(getFragmentManager(), "Datepickerdialog");
}

Sip setelah sampai pada step ini kita telah selesai membuat aplikasi Menampilkan data sampai Cari Data. Dan berikut
ini adalah keseluruhan koding pada MainActivity.java

MainActivity.java
package muharir17.github.uangkas;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.androidnetworking.AndroidNetworking;

54
import com.androidnetworking.common.Priority;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONObjectRequestListener;
import com.leavjenn.smoothdaterangepicker.date.SmoothDateRangePickerFragment;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

import muharir17.github.uangkas.helper.Config;

public class MainActivity extends AppCompatActivity {

TextView text_masuk, text_keluar, text_total;


ListView list_kas;
SwipeRefreshLayout swipe_refresh;
ArrayList<HashMap<String, String>> aruskas = new ArrayList<HashMap<String, String>>();

public static TextView text_filter;


public static String LINK, transaksi_id, status, jumlah, keterangan, tanggal, tanggal2,
tgl_dari, tgl_ke;
public static boolean filter;

String query_kas, query_total;

// session-intro
int sess_intro;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {

55
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

LINK = Config.host + "list.php";


transaksi_id = ""; status = ""; jumlah = ""; keterangan = ""; tanggal = ""; tanggal2 =
"";
tgl_dari = ""; tgl_ke = ""; query_kas = ""; query_total = ""; filter = false;

text_filter = (TextView) findViewById(R.id.text_filter);


text_masuk = (TextView) findViewById(R.id.text_masuk);
text_keluar = (TextView) findViewById(R.id.text_keluar);
text_total = (TextView) findViewById(R.id.text_total);
list_kas = (ListView) findViewById(R.id.list_kas);
swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);

swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi ORDER BY
transaksi_id DESC";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK') AS
masuk, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR') AS
keluar " +
"FROM transaksi";
LINK = Config.host + "list.php";
KasAdapter();
text_filter.setVisibility(View.GONE);
}
});

FloatingActionButton fab = findViewById(R.id.fab);

56
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, AddActivity.class));
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.action_filter) {
startActivity(new Intent(MainActivity.this, FilterActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}

private void KasAdapter(){

swipe_refresh.setRefreshing(true);
aruskas.clear(); list_kas.setAdapter(null);

Log.d("link", LINK );
AndroidNetworking.post( LINK )
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override

57
public void onResponse(JSONObject response) {
// do anything with response

NumberFormat rupiahFormat = NumberFormat.getInstance(Locale.GERMANY);

text_masuk.setText(
rupiahFormat.format(response.optDouble("masuk")));
text_keluar.setText(
rupiahFormat.format( response.optDouble("keluar") ));
text_total.setText(
rupiahFormat.format( response.optDouble("saldo") ));

try {
JSONArray jsonArray = response.optJSONArray("result");
for (int i = 0; i < jsonArray.length(); i++) {

JSONObject responses = jsonArray.getJSONObject(i);


HashMap<String, String> map = new HashMap<String, String>();

map.put("transaksi_id", responses.optString("transaksi_id"));
map.put("status", responses.optString("status"));
map.put("jumlah", responses.optString("jumlah"));
map.put("keterangan", responses.optString("keterangan"));
map.put("tanggal", responses.optString("tanggal"));
map.put("tanggal2", responses.optString("tanggal2"));

aruskas.add(map);
}

Adapter();

} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError error) {

58
// handle error
}
});
}

private void Adapter(){


SimpleAdapter simpleAdapter = new SimpleAdapter(this, aruskas, R.layout.list_kas,
new String[] { "transaksi_id", "status", "jumlah", "keterangan", "tanggal",
"tanggal2"},
new int[] {R.id.text_transaksi_id, R.id.text_status, R.id.text_jumlah,
R.id.text_keterangan,
R.id.text_tanggal, R.id.text_tanggal2});

list_kas.setAdapter(simpleAdapter);
list_kas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
transaksi_id = ((TextView)
view.findViewById(R.id.text_transaksi_id)).getText().toString();
status = ((TextView)
view.findViewById(R.id.text_status)).getText().toString();
jumlah = ((TextView)
view.findViewById(R.id.text_jumlah)).getText().toString();
keterangan = ((TextView)
view.findViewById(R.id.text_keterangan)).getText().toString();
tanggal = ((TextView)
view.findViewById(R.id.text_tanggal)).getText().toString();
tanggal2 = ((TextView)
view.findViewById(R.id.text_tanggal2)).getText().toString();
ListMenu();
}
});

swipe_refresh.setRefreshing(false);
}

private void ListMenu(){

59
final Dialog dialog = new Dialog(MainActivity.this);
dialog.setContentView(R.layout.list_menu);
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT);

TextView text_edit = (TextView) dialog.findViewById(R.id.text_edit);


TextView text_hapus = (TextView) dialog.findViewById(R.id.text_hapus);
dialog.show();

text_edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
startActivity(new Intent(MainActivity.this, EditActivity.class));
}
});
text_hapus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();

Hapus();
}
});
}

private void Hapus(){


AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Konfirmasi");
builder.setMessage("Yakin untuk mengahapus transaksi ini?");
builder.setPositiveButton(
"Yes",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();

60
AndroidNetworking.post( Config.host + "delete.php")
.addBodyParameter("transaksi_id", transaksi_id)
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
if
(response.optString("response").toString().equals("success")){
Toast.makeText(getApplicationContext(), "Data
berhasil dihapus",
Toast.LENGTH_LONG).show();

KasAdapter();

} else {
Toast.makeText(getApplicationContext(), "Gagal",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError error) {
// handle error
}
});

}
});

builder.setNegativeButton(
"No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});

61
builder.show();
}

public void onResume(){


super.onResume();

query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi ORDER BY transaksi_id
DESC";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK') AS masuk, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR') AS keluar " +
"FROM transaksi";

if (filter) {

query_kas =
"SELECT *, strftime('%d/%m/%Y', tanggal) AS tgl FROM transaksi " +
"WHERE (tanggal >= '" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "')
ORDER BY transaksi_id ASC ";
query_total =
"SELECT SUM(jumlah) AS total, " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='MASUK' AND (tanggal >=
'" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "') ), " +
"(SELECT SUM(jumlah) FROM transaksi WHERE status='KELUAR' AND (tanggal >=
'" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "')) " +
"FROM transaksi " +
"WHERE (tanggal >= '" + tgl_dari + "') AND (tanggal <= '" + tgl_ke + "')
";

LINK = Config.host + "filter.php?from=" + tgl_dari + "&to=" + tgl_ke;


filter = false;
}
KasAdapter();

62
}

//untuk pencarian data


private void _filterMysql(){
SmoothDateRangePickerFragment smoothDateRangePickerFragment =
SmoothDateRangePickerFragment
.newInstance(new SmoothDateRangePickerFragment.OnDateRangeSetListener() {
@Override
public void onDateRangeSet(SmoothDateRangePickerFragment view,
int yearStart, int monthStart,
int dayStart, int yearEnd,
int monthEnd, int dayEnd) {
String date = "You picked the following date range: \n"
+ "From " + dayStart + "/" + (++monthStart)
+ "/" + yearStart + " To " + dayEnd + "/"
+ (++monthEnd) + "/" + yearEnd;
Log.d("daterange_result", date);

tgl_dari = yearStart + "-" + monthStart + "-" + dayStart ;


tgl_ke = yearEnd + "-" + monthEnd + "-" + dayEnd ;
LINK = Config.host + "filter.php?from=" + tgl_dari + "&to=" +
tgl_ke;

text_filter.setVisibility(View.VISIBLE);
text_filter.setText(
dayStart + "/" + monthStart + "/" + yearStart + " - " +
dayStart + "/" + monthStart + "/" + yearStart
);
KasAdapter();
}
});
smoothDateRangePickerFragment.show(getFragmentManager(), "Datepickerdialog");
}
}
Sampai sini aplikasi yang kita buat sudah selesai 😊

63
BAB V
MEMPERCANTIK TAMPILAN DENGAN INTRO ALA APLIKASI TOKOPEDIA

5.1 Mempercantik Dengan IntroApp


IntroApp adalah plugin yang dapat kita gunakan untuk membuat intro aplikasi, intro
ini sering kita jumpai pada aplikasi yang baru kita unduh dari playStore.
Pertama tambahkan class java Baru dengan nama IntroActivity.
Kedua tambahkan Package Baru dengan nama Fragment dan tambahkan Fragment
sebanyak 3 buah ke dalamnya, seperti pada gambar di bawah ini :

Fragment yang telah di buat tampak seperti pada gambar berikut dibawah ini :

64
Setelah kita berhasil membuat fragment, jangan lupa tambahkan resource berupa
gambar untuk AppIntro, (mintalah kepada instruktur) gambar contoh tersebut.

Berikutnya kita ubah isi IntroActivity.java menjadi seperti berikut ini :

IntroActivity.java
package muharir17.github.uangkas;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;

import com.github.paolorotolo.appintro.AppIntro;
import com.github.paolorotolo.appintro.AppIntroFragment;

import muharir17.github.uangkas.fragment.Intro1;
import muharir17.github.uangkas.fragment.Intro2;
import muharir17.github.uangkas.fragment.Intro3;

public class IntroActivity extends AppIntro {

Intro1 intro1 = new Intro1();


Intro2 intro2 = new Intro2();
Intro3 intro3 = new Intro3();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addSlide(AppIntroFragment.newInstance("SELAMAT DATANG", "Saya
siap menjadi Android Developer!", R.drawable.android,
getResources().getColor(R.color.colorPrimary)));
addSlide(AppIntroFragment.newInstance("UANGKAS v.2", "Belajar
Membuat Aplikasi Manajemen Keuangan Dengan Android Studio, PHP &
MySQL",
R.drawable.calc,
getResources().getColor(R.color.colorPrimary)));
addSlide(AppIntroFragment.newInstance("", "",
R.drawable.coder_uniska,

65
getResources().getColor(R.color.colorPrimary)));

setBarColor(getResources().getColor(R.color.colorPrimary));

setSeparatorColor(getResources().getColor(R.color.circle_background))
;

// Hide Skip/Done button.


showSkipButton(true);
setProgressButtonEnabled(true);

// Turn vibration on and set intensity.


// NOTE: you will probably need to ask VIBRATE permission in
Manifest.
setVibrate(true);
setVibrateIntensity(30);
}

@Override
public void onSkipPressed(Fragment currentFragment) {
super.onSkipPressed(currentFragment);
// Do something when users tap on Skip button.
finish();
}

@Override
public void onDonePressed(Fragment currentFragment) {
super.onDonePressed(currentFragment);
// Do something when users tap on Done button.
finish();
}

@Override
public void onSlideChanged(@Nullable Fragment oldFragment,
@Nullable Fragment newFragment) {
super.onSlideChanged(oldFragment, newFragment);
// Do something when the slide changes.
}
}

Jangan lupa pada AndroidManifest.xml tambahkan IntroActivity.java agar bisa diload


saat tampil pertama kali.
<activity
android:name=".IntroActivity"
android:theme="@style/AppTheme.NoActionBar" />

66
Pada MainActivity.java tambahkan kode berikut pada method OnCreate

MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.……………………………………………………………………………………………………………………………………………………………………………………………………
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

sess_intro = 0;
sharedPreferences = getSharedPreferences("sess_pref_mhr",
Context.MODE_APPEND);
sess_intro = sharedPreferences.getInt("intro", 0);
if (sess_intro == 0){
// set session
sharedPreferences =
getSharedPreferences("sess_pref_mhr", Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
editor.putInt("intro", 1);
editor.apply();
// call intro
startActivity(new Intent(MainActivity.this,
IntroActivity.class));
}

LINK = Config.host + "list.php";


…………………………………………………………………………………………………………………………………………………………………………………………….
swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);

Hanya tulisan yang di cetak tebal saja yang perlu anda tambahkan. Sip selesai sudah
cara pembuatan aplikasi kas dengan Android Mysql.

5.2 Tampilan Akhir Aplikasi


Pada poin ini akan menampilkan semua tampilan yang sudah kita buat pada bab
sebelumnya, pastikan tampilan aplikasinya sesuai dengan gambar berikut ya :

67
Intro 1 Intro 2 Intro 3

List Data Tambah Data Menu Dialog

68
Dialog Hapus Data Edit Data

69
DAFTAR PUSTAKA

https://developer.android.com/docs
https://medium.com/@erthru/operasi-crud-android-studio-menggunakan-
mysql-php-dengan-kotlin-afca7502d721
https://github.com/AppIntro/AppIntro
https://github.com/amitshekhariitbhu/Fast-Android-Networking
https://lazday.com/superhero/
https://www.tutorialspoint.com/android/

70
TENTANG PENULIS

Nama : Muharir

TTL : Petanahan, 17 Januari 1994

Jenis Kel : Laki-Laki

Alamat : Abumbunjaya Rt.01 No.151 Sei Tabuk

Email : muharir17@gmail.com

Riwayat Pendidikan

No Tingkat Nama Pendidikan Ijazah/Lulus Tempat


1 SD SDN Kota 2 2005 Sungai Tabuk
2 SMP SMPN 1 2008 Sungai Tabuk
3 SMA SMAN 1 2011 Sungai Tabuk
4 S1 UNISKA 2015 Banjarmasin
5 S2 UDINUS 2017 Semarang
6 S3 - - -

71

Anda mungkin juga menyukai