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:
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
Table transaksi
Cukup hanya 1 tabel saja, nanti kita akan mengolahnya sedemikan rupa agar
meghasilkan data-data yang variative di table transaksi.
<?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"
);
$masuk = $row['masuk'];
$keluar = $row['keluar'];
echo json_encode(array(
'masuk' => $masuk,
'keluar' => $keluar,
'saldo' => ($masuk - $keluar),
'result' => $result
));
mysqli_close($conn);
5
?>
<?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' ));
}
?>
<?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' ));
}
?>
<?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' ));
}
?>
<?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();
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 );
$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
9
Jika terjadi kesalahan Error Gradle saat membuat project seperti dibawah ini, maka
pastikan anda terkoneksi ke internet dan resolve kesalahan yang terjadi.
Setelah Klik Try Again, tunggu hingga proses resolve selesai. Jika berhasil maka
akan tampil seperti berikut :
10
Dan Design Viewnya pun muncul
Sip.
11
maven { url 'https://jitpack.io' }
}
}
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.
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 :
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
@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>
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>
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
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 :
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();
}
});
Jalankan Pada emulator atau handphone anda, klik icon Add, apakah sudah berpindah
ke AddActivity, jika iya maka anda sudah berhasil menampilkan AddActivity dengan
benar.
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>
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>
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>
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
Tambahkan 1 buah kelas Java dengan nama Config.java, isi dari config.java adalah
sebagai berikut :
31
Config.java
package muharir17.github.uangkas.helper;
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;
32
4.2 Menampilkan Data Pada List View
Tambahkan inisialisasi Object di bawah deklarasi kelas seperti berikut :
public class MainActivity extends AppCompatActivity {
@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);
}
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
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++) {
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 + "') ";
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);
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);
}
});
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;
String status;
39
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
status = "";
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;
}
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;
}
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
}
});
}
}
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();
}
});
}
swipe_refresh.setRefreshing(false);
}
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;
RadioGroup radio_status;
RadioButton radio_masuk, radio_keluar;
44
String status, tanggal;
DatePickerDialog datePickerDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
Detail();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Edit");
}
@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}
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;
}
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 {
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
}
});
}
}
});
}
}
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();
}
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;
50
DatePickerDialog datePickerDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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);
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;
// 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);
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);
}
});
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);
}
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
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++) {
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
}
});
}
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);
}
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);
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();
}
});
}
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();
}
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 + "')
";
62
}
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
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.
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;
@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))
;
@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.
}
}
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));
}
Hanya tulisan yang di cetak tebal saja yang perlu anda tambahkan. Sip selesai sudah
cara pembuatan aplikasi kas dengan Android Mysql.
67
Intro 1 Intro 2 Intro 3
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
Email : muharir17@gmail.com
Riwayat Pendidikan
71