Cara Membuat Aplikasi Android Pemesanan Travel Menggunakan Android Studio Dengan Database SQLite
maswijaba.my.id - Assalamualaikum wr.wb. Puji syukur kita bisa dipertemukan lagi di kesempatan kali ini, semoga semuanya sehat-sehat ya. Pada kesempatan kali ini saya akan membahas bagaimana Cara Membuat Aplikasi Android Pemesanan Travel Menggunakan Android Studio Dengan Database SQLite.
Tutorial sederhana ini dirasa bisa membantu kalian untuk membuat
aplikasi Android, walaupun tidak sempurna dan bisa dikatakan sederhana
mudah-mudahan bermanfaat untuk kalian yang ingin belajar tentang
Android.
Aplikasi ini di desain dengan sedemikian rupa dan pastinya untuk pemula sangat mudah untuk mempelajarinya. Aplikasi ini dibangun secara offline karena untuk datanya saya menggunakan database SQLite bukan menggunakan API seperti tutorial sebelumnya.
Aplikasi ini sangat disarankan untuk membuat tugas Android sebagai referensi kalian untuk tugas-tugas mobile, buat tugas akhir atau skripsi juga tidak apa-apa asalkan kalian memperbaharuinya (tambahkan yang belum ada).
Langsung saja kita masuk ke cara pengaplikasiannya dengan mengikuti step-step di bawah ini.
1. Buat Project Baru di Android Studio
Klik File - Project Baru. Ketika diminta untuk memilih Default Activity, kita memilih Empty Activity dan klik Next. (Untuk minSDK, saya set API 21)
2. Buat menu Login
Buat activity_login.xml dan LoginActivity.java dan isi scriptnya seperti dibawah ini
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:background="@color/gray">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbarHeader"
android:layout_width="match_parent"
android:layout_height="170dp"
android:background="@drawable/header"
android:elevation="5dp"
android:fitsSystemWindows="true" />
<TextView
android:id="@+id/tvDesc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="25dp"
android:elevation="5dp"
android:text="Travel Apps Booking"
android:textColor="@android:color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tvLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvDesc"
android:layout_alignStart="@+id/tvDesc"
android:elevation="5dp"
android:text="Login"
android:textColor="@android:color/white"
android:textSize="28sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/circle5"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_below="@+id/toolbarHeader"
android:layout_alignParentStart="true"
android:layout_marginStart="-70dp"
android:layout_marginTop="70dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle3"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_below="@+id/toolbarHeader"
android:layout_alignParentEnd="true"
android:layout_marginEnd="-100dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle4"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_alignParentBottom="true"
android:layout_marginStart="-100dp"
android:layout_marginBottom="50dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle1"
android:layout_width="182dp"
android:layout_height="182dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="-80dp"
android:layout_marginBottom="90dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle2"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_alignParentBottom="true"
android:layout_marginEnd="-50dp"
android:layout_marginBottom="-50dp"
android:layout_toEndOf="@+id/circle4"
android:src="@drawable/circletransparant" />
<FrameLayout
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="350dp"
android:layout_centerInParent="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/txtLoginUser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp">
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimaryDark"
android:drawableStart="@drawable/ic_email"
android:hint=" Masukkan Email"
android:imeOptions="actionNext"
android:inputType="textEmailAddress"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/txtLoginPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
app:passwordToggleEnabled="true">
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimaryDark"
android:drawableStart="@drawable/ic_password"
android:hint=" Password"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="30dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="30dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/masuk"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="8dp"
android:text="Login"
android:textColor="@android:color/white"
android:textSize="16sp"
android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/colorPrimaryDark"
app:cornerRadius="50dp" />
</RelativeLayout>
<Button
android:id="@+id/ke_daftar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="10dp"
android:background="@android:color/transparent"
android:text="@string/button_not_register"
android:textAllCaps="false"
android:textColor="#92A7AB"
android:textSize="12sp"
app:cornerRadius="50dp" />
</com.google.android.material.card.MaterialCardView>
</RelativeLayout>
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:text="© Travel Apps by Azhar Rivaldi 2020"
android:textColor="#92A7AB"
android:textSize="12sp" />
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
LoginActivity.java
package com.wijaba.travel.activity;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import com.wijaba.travel.R;
import com.wijaba.travel.adapter.AlertDialogManager;
import com.wijaba.travel.database.DatabaseHelper;
import com.wijaba.travel.session.SessionManager;
public class LoginActivity extends AppCompatActivity {
EditText txtUsername, txtPassword;
Button btnLogin, btnRegister;
AlertDialogManager alert = new AlertDialogManager();
SessionManager session;
DatabaseHelper dbHelper;
SQLiteDatabase db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
dbHelper = new DatabaseHelper(this);
db = dbHelper.getWritableDatabase();
session = new SessionManager(getApplicationContext());
txtUsername = findViewById(R.id.email);
txtPassword = findViewById(R.id.password);
btnLogin = findViewById(R.id.masuk);
btnRegister = findViewById(R.id.ke_daftar);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// Get username, password from EditText
String username = txtUsername.getText().toString();
String password = txtPassword.getText().toString();
// Check if username, password is filled
try {
// Check if username, password is filled
if (username.trim().length() > 0 && password.trim().length() > 0) {
dbHelper.open();
if (dbHelper.Login(username, password)) {
session.createLoginSession(username);
finish();
Intent i = new Intent(getApplicationContext(), MainActivity.class);
startActivity(i);
} else {
alert.showAlertDialog(LoginActivity.this, "Login gagal..", "Email atau Password salah!", false);
}
} else {
alert.showAlertDialog(LoginActivity.this, "Login gagal..", "Form tidak boleh kosong!", false);
}
} catch (Exception e) {
Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(i);
}
});
}
public static void setWindowFlag(Activity activity, final int bits, boolean on) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
@Override
public void onBackPressed() {
final AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
builder.setMessage("Apakah Anda ingin keluar dari aplikasi?");
builder.setCancelable(true);
builder.setNegativeButton(getString(R.string.batal), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setPositiveButton(getString(R.string.keluar), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAffinity();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}
3. Buat menu Registernya.
Buat activity_register.xml dan RegisterActivity.java dan isi scriptnya seperti dibawah ini.
activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:background="@color/gray">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbarHeader"
android:layout_width="match_parent"
android:layout_height="170dp"
android:background="@drawable/header"
android:elevation="5dp"
android:fitsSystemWindows="true" />
<TextView
android:id="@+id/tvDesc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="25dp"
android:elevation="5dp"
android:text="Travel Apps Booking"
android:textColor="@android:color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tvLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvDesc"
android:layout_alignStart="@+id/tvDesc"
android:elevation="5dp"
android:text="Register"
android:textColor="@android:color/white"
android:textSize="28sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/circle5"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_below="@+id/toolbarHeader"
android:layout_alignParentStart="true"
android:layout_marginStart="-70dp"
android:layout_marginTop="70dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle3"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_below="@+id/toolbarHeader"
android:layout_alignParentEnd="true"
android:layout_marginEnd="-100dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle4"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_alignParentBottom="true"
android:layout_marginStart="-100dp"
android:layout_marginBottom="50dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle1"
android:layout_width="182dp"
android:layout_height="182dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="-80dp"
android:layout_marginBottom="90dp"
android:src="@drawable/circletransparant" />
<ImageView
android:id="@+id/circle2"
android:layout_width="134dp"
android:layout_height="134dp"
android:layout_alignParentBottom="true"
android:layout_marginEnd="-50dp"
android:layout_marginBottom="-50dp"
android:layout_toEndOf="@+id/circle4"
android:src="@drawable/circletransparant" />
<FrameLayout
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_centerInParent="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="15dp"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/txtUser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp">
<EditText
android:id="@+id/reg_nama"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimaryDark"
android:drawableStart="@drawable/ic_person"
android:hint=" Masukkan Nama"
android:imeOptions="actionNext"
android:inputType="textPersonName"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/txtLoginUser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp">
<EditText
android:id="@+id/reg_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimaryDark"
android:drawableStart="@drawable/ic_email"
android:hint=" Masukkan Email"
android:imeOptions="actionNext"
android:inputType="textEmailAddress"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/txtLoginPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
app:passwordToggleEnabled="true">
<EditText
android:id="@+id/reg_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimaryDark"
android:drawableStart="@drawable/ic_password"
android:hint=" Password"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="30dp"
android:layout_marginTop="80dp"
android:layout_marginEnd="30dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/daftar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="8dp"
android:text="Register"
android:textColor="@android:color/white"
android:textSize="16sp"
android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/colorPrimaryDark"
app:cornerRadius="50dp" />
</RelativeLayout>
<Button
android:id="@+id/ke_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="10dp"
android:background="@android:color/transparent"
android:text="@string/after_register"
android:textAllCaps="false"
android:textColor="#92A7AB"
android:textSize="12sp"
app:cornerRadius="50dp" />
</com.google.android.material.card.MaterialCardView>
</RelativeLayout>
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:text="© Travel Apps by Azhar Rivaldi 2020"
android:textColor="#92A7AB"
android:textSize="12sp" />
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
RegisterActivity.java
package com.wijaba.travel.activity;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.wijaba.travel.R;
import com.wijaba.travel.database.DatabaseHelper;
public class RegisterActivity extends AppCompatActivity {
EditText txtName, txtUsername, txtPassword;
Button btnDaftar, btnKeLogin;
DatabaseHelper dbHelper;
SQLiteDatabase db;
String name, username, password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
dbHelper = new DatabaseHelper(this);
db = dbHelper.getWritableDatabase();
txtName = findViewById(R.id.reg_nama);
txtUsername = findViewById(R.id.reg_email);
txtPassword = findViewById(R.id.reg_password);
btnDaftar = findViewById(R.id.daftar);
btnKeLogin = findViewById(R.id.ke_login);
btnDaftar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
name = txtName.getText().toString();
username = txtUsername.getText().toString();
password = txtPassword.getText().toString();
try {
if (username.trim().length() > 0 && password.trim().length() > 0 && name.trim().length() > 0) {
dbHelper.open();
dbHelper.Register(username, password, name);
Toast.makeText(RegisterActivity.this, "Daftar berhasil", Toast.LENGTH_LONG).show();
finish();
} else {
Toast.makeText(RegisterActivity.this, "Daftar gagal, lengkapi form!", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(RegisterActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
btnKeLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
public static void setWindowFlag(Activity activity, final int bits, boolean on) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
}
4. Buat menu Main.
Sebagai menu utama Aplikasi, buat activity_main.xml dan MainActivity.java lalu isi skrip dibawah ini.
activity_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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray"
android:orientation="vertical">
<FrameLayout
android:id="@+id/flMain"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="@drawable/bg_home_wave"
android:fitsSystemWindows="true">
<RelativeLayout
android:id="@+id/rlAppName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:fontFamily="monospace"
android:text="Travelindo"
android:textColor="@android:color/white"
android:textSize="24sp"
android:textStyle="italic" />
</RelativeLayout>
</FrameLayout>
<LinearLayout
android:id="@+id/llCurved"
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="@drawable/bg_home_curve"
android:orientation="horizontal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_weight="0.8"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="8dp">
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:gravity="center"
android:onClick="profileMenu"
android:orientation="vertical"
android:padding="16dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/imgProfile"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:src="@drawable/profile" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/imgProfile"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="PROFILE"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="#F44336"
android:textStyle="bold" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:gravity="center"
android:onClick="historyMenu"
android:orientation="vertical"
android:padding="16dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/imgHistory"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:src="@drawable/notification" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/imgHistory"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="RIWAYAT"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="#9C27B0"
android:textStyle="bold" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.8"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp">
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:gravity="center"
android:onClick="bookKereta"
android:orientation="vertical"
android:padding="16dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/imgKereta"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:src="@drawable/book_kereta" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/imgKereta"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="BOOKING\nKERETA"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="#E91E63"
android:textStyle="bold" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_weight="1"
android:gravity="center"
android:onClick="bookHotel"
android:orientation="vertical"
android:padding="16dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimaryDark"
app:strokeWidth="2dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/imgHotel"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:src="@drawable/book_hotel" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/imgHotel"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="BOOKING\nHOTEL"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="#FFCC00"
android:textStyle="bold" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/out"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginLeft="64dp"
android:layout_marginRight="64dp"
android:layout_marginBottom="16dp"
android:text="Sign Out"
android:textSize="16sp"
android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/colorPrimaryDark"
app:cornerRadius="50dp" />
</LinearLayout>
MainActivity.java
package com.wijaba.travel.activity;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.wijaba.travel.R;
import com.wijaba.travel.adapter.AlertDialogManager;
import com.wijaba.travel.session.SessionManager;
public class MainActivity extends AppCompatActivity {
AlertDialogManager alert = new AlertDialogManager();
SessionManager session;
Button btnLogout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
session = new SessionManager(getApplicationContext());
session.checkLogin();
btnLogout = findViewById(R.id.out);
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("Anda yakin ingin keluar ?")
.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
session.logoutUser();
}
})
.setNegativeButton("Tidak", null)
.create();
dialog.show();
}
});
}
public void profileMenu(View v) {
Intent i = new Intent(this, ProfileActivity.class);
startActivity(i);
}
public void historyMenu(View v) {
Intent i = new Intent(this, HistoryActivity.class);
startActivity(i);
}
public void bookKereta(View v) {
Intent i = new Intent(this, BookKeretaActivity.class);
startActivity(i);
}
public void bookHotel(View v) {
Toast.makeText(getApplicationContext(), "Mohon maaf, sistem sedang dalam pengembangan.", Toast.LENGTH_LONG).show();
}
}
5. Buat menu untuk mem-Booking.
Sebagai contoh saya hanya menambahkan menu booking satu, jika kalian ingin menambahkan lebih dari satu tidak apa-apa. Buat activity_book_kereta.xml dan BookKeretaActivity.java lalu masukan skripnya.
activity_book_kereta.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tbKrl"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@drawable/bg_home_wave"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tbKrl">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimary"
app:strokeWidth="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="Tujuan Perjalanan"
android:textAllCaps="true"
android:textColor="@color/colorPrimary"
android:textSize="19sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="Asal"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/black" />
<Spinner
android:id="@+id/asal"
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:text="Tujuan"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/black" />
<Spinner
android:id="@+id/tujuan"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_weight="1" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimary"
app:strokeWidth="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="Waktu Perjalanan"
android:textAllCaps="true"
android:textColor="@color/colorPrimary"
android:textSize="19sp"
android:textStyle="bold" />
<EditText
android:id="@+id/tanggal_berangkat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_date"
android:drawablePadding="20dp"
android:hint="Tanggal Berangkat"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/colorPrimary"
android:textColorHint="#BACBCF" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimary"
app:strokeWidth="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/coba"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="JUMLAH"
android:textAllCaps="true"
android:textColor="@color/colorPrimary"
android:textSize="19sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dewasa"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/black" />
<Spinner
android:id="@+id/dewasa"
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Anak-anak"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textColor="@color/black" />
<Spinner
android:id="@+id/anak"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="8dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.button.MaterialButton
android:id="@+id/book"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="8dp"
android:layout_marginRight="24dp"
android:text="Booking Sekarang"
android:textColor="@android:color/white"
android:textSize="16sp"
android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/colorPrimaryDark"
app:cornerRadius="50dp" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
BookKeretaActivity.java
package com.wijaba.travel.activity;
import android.app.DatePickerDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.wijaba.travel.R;
import com.wijaba.travel.database.DatabaseHelper;
import com.wijaba.travel.session.SessionManager;
import java.util.Calendar;
import java.util.HashMap;
public class BookKeretaActivity extends AppCompatActivity {
protected Cursor cursor;
DatabaseHelper dbHelper;
SQLiteDatabase db;
Spinner spinAsal, spinTujuan, spinDewasa, spinAnak;
SessionManager session;
String email;
int id_book;
public String sAsal, sTujuan, sTanggal, sDewasa, sAnak;
int jmlDewasa, jmlAnak;
int hargaDewasa, hargaAnak;
int hargaTotalDewasa, hargaTotalAnak, hargaTotal;
private EditText etTanggal;
private DatePickerDialog dpTanggal;
Calendar newCalendar = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_kereta);
dbHelper = new DatabaseHelper(BookKeretaActivity.this);
db = dbHelper.getReadableDatabase();
final String[] asal = {"Jakarta", "Bandung", "Purwokerto", "Yogyakarta", "Surabaya"};
final String[] tujuan = {"Jakarta", "Bandung", "Purwokerto", "Yogyakarta", "Surabaya"};
final String[] dewasa = {"0", "1", "2", "3", "4", "5"};
final String[] anak = {"0", "1", "2", "3", "4", "5"};
spinAsal = findViewById(R.id.asal);
spinTujuan = findViewById(R.id.tujuan);
spinDewasa = findViewById(R.id.dewasa);
spinAnak = findViewById(R.id.anak);
ArrayAdapter<CharSequence> adapterAsal = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, asal);
adapterAsal.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinAsal.setAdapter(adapterAsal);
ArrayAdapter<CharSequence> adapterTujuan = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, tujuan);
adapterTujuan.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinTujuan.setAdapter(adapterTujuan);
ArrayAdapter<CharSequence> adapterDewasa = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, dewasa);
adapterDewasa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinDewasa.setAdapter(adapterDewasa);
ArrayAdapter<CharSequence> adapterAnak = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, anak);
adapterAnak.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinAnak.setAdapter(adapterAnak);
spinAsal.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sAsal = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinTujuan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sTujuan = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinDewasa.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sDewasa = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinAnak.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sAnak = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
Button btnBook = findViewById(R.id.book);
etTanggal = findViewById(R.id.tanggal_berangkat);
etTanggal.setInputType(InputType.TYPE_NULL);
etTanggal.requestFocus();
session = new SessionManager(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
setDateTimeField();
btnBook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
perhitunganHarga();
if (sAsal != null && sTujuan != null && sTanggal != null && sDewasa != null) {
if ((sAsal.equalsIgnoreCase("jakarta") && sTujuan.equalsIgnoreCase("jakarta"))
|| (sAsal.equalsIgnoreCase("bandung") && sTujuan.equalsIgnoreCase("bandung"))
|| (sAsal.equalsIgnoreCase("purwokerto") && sTujuan.equalsIgnoreCase("purwokerto"))
|| (sAsal.equalsIgnoreCase("yogyakarta") && sTujuan.equalsIgnoreCase("yogyakarta"))
|| (sAsal.equalsIgnoreCase("surabaya") && sTujuan.equalsIgnoreCase("surabaya"))) {
Toast.makeText(BookKeretaActivity.this, "Asal dan Tujuan tidak boleh sama !", Toast.LENGTH_LONG).show();
} else {
AlertDialog dialog = new AlertDialog.Builder(BookKeretaActivity.this)
.setTitle("Ingin booking kereta sekarang?")
.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
db.execSQL("INSERT INTO TB_BOOK (asal, tujuan, tanggal, dewasa, anak) VALUES ('" +
sAsal + "','" +
sTujuan + "','" +
sTanggal + "','" +
sDewasa + "','" +
sAnak + "');");
cursor = db.rawQuery("SELECT id_book FROM TB_BOOK ORDER BY id_book DESC", null);
cursor.moveToLast();
if (cursor.getCount() > 0) {
cursor.moveToPosition(0);
id_book = cursor.getInt(0);
}
db.execSQL("INSERT INTO TB_HARGA (username, id_book, harga_dewasa, harga_anak, harga_total) VALUES ('" +
email + "','" +
id_book + "','" +
hargaTotalDewasa + "','" +
hargaTotalAnak + "','" +
hargaTotal + "');");
Toast.makeText(BookKeretaActivity.this, "Booking berhasil", Toast.LENGTH_LONG).show();
finish();
} catch (Exception e) {
Toast.makeText(BookKeretaActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
})
.setNegativeButton("Tidak", null)
.create();
dialog.show();
}
} else {
Toast.makeText(BookKeretaActivity.this, "Mohon lengkapi data pemesanan!", Toast.LENGTH_LONG).show();
}
}
});
setupToolbar();
}
private void setupToolbar() {
Toolbar toolbar = findViewById(R.id.tbKrl);
toolbar.setTitle("Form Booking");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public void perhitunganHarga() {
if (sAsal.equalsIgnoreCase("jakarta") && sTujuan.equalsIgnoreCase("bandung")) {
hargaDewasa = 100000;
hargaAnak = 70000;
} else if (sAsal.equalsIgnoreCase("jakarta") && sTujuan.equalsIgnoreCase("surabaya")) {
hargaDewasa = 200000;
hargaAnak = 150000;
} else if (sAsal.equalsIgnoreCase("jakarta") && sTujuan.equalsIgnoreCase("purwokerto")) {
hargaDewasa = 150000;
hargaAnak = 120000;
} else if (sAsal.equalsIgnoreCase("jakarta") && sTujuan.equalsIgnoreCase("yogyakarta")) {
hargaDewasa = 180000;
hargaAnak = 140000;
} else if (sAsal.equalsIgnoreCase("bandung") && sTujuan.equalsIgnoreCase("jakarta")) {
hargaDewasa = 100000;
hargaAnak = 70000;
} else if (sAsal.equalsIgnoreCase("bandung") && sTujuan.equalsIgnoreCase("surabaya")) {
hargaDewasa = 120000;
hargaAnak = 100000;
} else if (sAsal.equalsIgnoreCase("bandung") && sTujuan.equalsIgnoreCase("purwokerto")) {
hargaDewasa = 120000;
hargaAnak = 90000;
} else if (sAsal.equalsIgnoreCase("bandung") && sTujuan.equalsIgnoreCase("yogyakarta")) {
hargaDewasa = 190000;
hargaAnak = 160000;
} else if (sAsal.equalsIgnoreCase("surabaya") && sTujuan.equalsIgnoreCase("jakarta")) {
hargaDewasa = 200000;
hargaAnak = 150000;
} else if (sAsal.equalsIgnoreCase("surabaya") && sTujuan.equalsIgnoreCase("bandung")) {
hargaDewasa = 120000;
hargaAnak = 100000;
} else if (sAsal.equalsIgnoreCase("surabaya") && sTujuan.equalsIgnoreCase("purwokerto")) {
hargaDewasa = 170000;
hargaAnak = 130000;
} else if (sAsal.equalsIgnoreCase("surabaya") && sTujuan.equalsIgnoreCase("yogyakarta")) {
hargaDewasa = 180000;
hargaAnak = 150000;
} else if (sAsal.equalsIgnoreCase("purwokerto") && sTujuan.equalsIgnoreCase("jakarta")) {
hargaDewasa = 150000;
hargaAnak = 120000;
} else if (sAsal.equalsIgnoreCase("purwokerto") && sTujuan.equalsIgnoreCase("bandung")) {
hargaDewasa = 120000;
hargaAnak = 90000;
} else if (sAsal.equalsIgnoreCase("purwokerto") && sTujuan.equalsIgnoreCase("yogyakarta")) {
hargaDewasa = 80000;
hargaAnak = 40000;
} else if (sAsal.equalsIgnoreCase("purwokerto") && sTujuan.equalsIgnoreCase("surabaya")) {
hargaDewasa = 170000;
hargaAnak = 130000;
} else if (sAsal.equalsIgnoreCase("yogyakarta") && sTujuan.equalsIgnoreCase("jakarta")) {
hargaDewasa = 180000;
hargaAnak = 140000;
} else if (sAsal.equalsIgnoreCase("yogyakarta") && sTujuan.equalsIgnoreCase("bandung")) {
hargaDewasa = 190000;
hargaAnak = 160000;
} else if (sAsal.equalsIgnoreCase("yogyakarta") && sTujuan.equalsIgnoreCase("purwokerto")) {
hargaDewasa = 80000;
hargaAnak = 40000;
} else if (sAsal.equalsIgnoreCase("yogyakarta") && sTujuan.equalsIgnoreCase("surabaya")) {
hargaDewasa = 180000;
hargaAnak = 150000;
}
jmlDewasa = Integer.parseInt(sDewasa);
jmlAnak = Integer.parseInt(sAnak);
hargaTotalDewasa = jmlDewasa * hargaDewasa;
hargaTotalAnak = jmlAnak * hargaAnak;
hargaTotal = hargaTotalDewasa + hargaTotalAnak;
}
private void setDateTimeField() {
etTanggal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dpTanggal.show();
}
});
dpTanggal = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar newDate = Calendar.getInstance();
newDate.set(year, monthOfYear, dayOfMonth);
String[] bulan = {"Januari", "Februari", "Maret", "April", "Mei",
"Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};
sTanggal = dayOfMonth + " " + bulan[monthOfYear] + " " + year;
etTanggal.setText(sTanggal);
}
}, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
}
}
6. Buat Menu History.
Buat activity_history.xml , HistoryActivity.java dan list_item_booking.xml lalu masukan skripnya.
activity_history.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tbHistory"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@drawable/bg_home_wave"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tbHistory">
<ListView
android:id="@+id/list_booking"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:dividerHeight="0dp" />
</RelativeLayout>
<TextView
android:id="@+id/noHistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Tidak Ada Riwayat Booking"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:visibility="gone" />
</RelativeLayout>
HistoryActivity.java
package com.wijaba.travel.activity;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.wijaba.travel.R;
import com.wijaba.travel.model.HistoryModel;
import com.wijaba.travel.adapter.HistoryAdapter;
import com.wijaba.travel.database.DatabaseHelper;
import com.wijaba.travel.session.SessionManager;
import java.util.ArrayList;
import java.util.HashMap;
public class HistoryActivity extends AppCompatActivity {
protected Cursor cursor;
DatabaseHelper dbHelper;
SQLiteDatabase db;
SessionManager session;
String id_book = "", asal, tujuan, tanggal, dewasa, anak, riwayat, total;
String email;
TextView tvNotFound;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
dbHelper = new DatabaseHelper(this);
db = dbHelper.getReadableDatabase();
tvNotFound = findViewById(R.id.noHistory);
session = new SessionManager(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
refreshList();
setupToolbar();
}
private void setupToolbar() {
Toolbar toolbar = findViewById(R.id.tbHistory);
toolbar.setTitle("Riwayat Booking");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public void refreshList() {
final ArrayList<HistoryModel> hasil = new ArrayList<>();
cursor = db.rawQuery("SELECT * FROM TB_BOOK, TB_HARGA WHERE TB_BOOK.id_book = TB_HARGA.id_book AND username='" + email + "'", null);
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
id_book = cursor.getString(0);
asal = cursor.getString(1);
tujuan = cursor.getString(2);
tanggal = cursor.getString(3);
dewasa = cursor.getString(4);
anak = cursor.getString(5);
total = cursor.getString(10);
riwayat = "Berhasil melakukan booking untuk melakukan perjalanan dari " + asal + " menuju " + tujuan + " pada tanggal " + tanggal + ". " +
"Jumlah pembelian tiket dewasa sejumlah " + dewasa + " dan tiket anak-anak sejumlah " + anak + ".";
hasil.add(new HistoryModel(id_book, tanggal, riwayat, total, R.drawable.profile));
}
ListView listBook = findViewById(R.id.list_booking);
HistoryAdapter arrayAdapter = new HistoryAdapter(this, hasil);
listBook.setAdapter(arrayAdapter);
//delete data
listBook.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
final String selection = hasil.get(i).getIdBook();
final CharSequence[] dialogitem = {"Hapus Data"};
AlertDialog.Builder builder = new AlertDialog.Builder(HistoryActivity.this);
builder.setTitle("Pilihan");
builder.setItems(dialogitem, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
db.execSQL("DELETE FROM TB_BOOK where id_book = " + selection + "");
id_book = "";
} catch (Exception e) {
e.printStackTrace();
}
refreshList();
}
});
builder.create().show();
}
});
if (id_book.equals("")) {
tvNotFound.setVisibility(View.VISIBLE);
listBook.setVisibility(View.GONE);
} else {
tvNotFound.setVisibility(View.GONE);
listBook.setVisibility(View.VISIBLE);
}
}
}
list_item_booking.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView 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:clipToPadding="true"
app:cardCornerRadius="10dp"
app:cardElevation="5dp"
app:cardUseCompatPadding="true">
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@color/colorPrimary" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<ImageView
android:id="@+id/image"
android:layout_width="64dp"
android:layout_height="64dp"
android:padding="4dp"
android:src="@drawable/profile" />
<LinearLayout
android:id="@+id/text_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_toEndOf="@+id/image"
android:orientation="vertical"
android:paddingStart="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:gravity="bottom"
android:orientation="horizontal">
<TextView
android:id="@+id/id_booking"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:textColor="@color/black"
android:textStyle="bold"
tools:text="ID : 1051" />
<TextView
android:id="@+id/tanggal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="end"
android:textColor="@color/black"
android:textStyle="bold"
tools:text="30 September 2017" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/riwayat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textColor="@color/black"
tools:text="Berhasil melakukan booking untuk melakukan perjalanan dari Jakarta menuju Bandung pada tanggal 30 September 2017. Jumlah pembelian tiket dewasa sejumlah 1 dan tiket anak-anak sejumlah 0." />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_total"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:textColor="@color/black"
android:textStyle="bold"
tools:text="Total Harga" />
<TextView
android:id="@+id/total"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="end"
android:textColor="@color/black"
android:textStyle="bold"
tools:text="Rp. 400.000" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
7. Buat menu Profil
Untuk menampilkan profil yang akan memesan travel. Buat activity_profile.xml dan ProfileActivity.java
activity_profile.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tbProfile"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@drawable/bg_home_wave"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tbProfile">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardCornerRadius="10dp"
app:cardElevation="3dp"
app:strokeColor="@color/colorPrimary"
app:strokeWidth="2dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<TextView
android:id="@+id/idSewa"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Daftar Penyewa"
android:textColor="@color/colorPrimary"
android:textSize="19sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/idSewa"
android:layout_marginTop="20dp"
android:text="Nama :"
android:textColor="@android:color/black"
android:textSize="17sp" />
<TextView
android:id="@+id/lblName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtName"
android:text="Azhar Rivaldi"
android:textSize="16sp" />
<TextView
android:id="@+id/txtEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/lblName"
android:layout_marginTop="20dp"
android:text="Email :"
android:textColor="@android:color/black"
android:textSize="17sp" />
<TextView
android:id="@+id/lblEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtEmail"
android:text="azharrivaldi@gmail.com"
android:textSize="16sp" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</ScrollView>
</RelativeLayout>
ProfileActivity.java
package com.wijaba.travel.activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.wijaba.travel.R;
import com.wijaba.travel.database.DatabaseHelper;
import com.wijaba.travel.session.SessionManager;
import java.util.HashMap;
public class ProfileActivity extends AppCompatActivity {
protected Cursor cursor;
DatabaseHelper dbHelper;
SQLiteDatabase db;
SessionManager session;
String name, email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
dbHelper = new DatabaseHelper(this);
session = new SessionManager(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
db = dbHelper.getReadableDatabase();
cursor = db.rawQuery("SELECT * FROM TB_USER WHERE username = '" + email + "'", null);
cursor.moveToFirst();
if (cursor.getCount() > 0) {
cursor.moveToPosition(0);
name = cursor.getString(2);
}
TextView lblName = findViewById(R.id.lblName);
TextView lblEmail = findViewById(R.id.lblEmail);
lblName.setText(name);
lblEmail.setText(email);
setupToolbar();
}
private void setupToolbar() {
Toolbar toolbar = findViewById(R.id.tbProfile);
toolbar.setTitle("Identitas Penyewa");
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
8. Buat AlertDialogManager.java
Untuk membuat custom alert dialog.
package com.wijaba.travel.adapter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import com.wijaba.travel.R;
public class AlertDialogManager {
public void showAlertDialog(Context context, String title, String message, Boolean status) {
AlertDialog alertDialog = new AlertDialog.Builder(context).create();
alertDialog.setTitle(title);
alertDialog.setMessage(message);
if (status != null)
alertDialog.setIcon((status) ? R.drawable.ic_success : R.drawable.ic_fail);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.show();
}
}
9. Buat SessionManager.java
Berguna agar user tidak logout jika sudah menutup aplikasinya.
package com.wijaba.travel.session;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import com.wijaba.travel.activity.LoginActivity;
import java.util.HashMap;
public class SessionManager {
SharedPreferences pref;
SharedPreferences.Editor editor;
Context context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "AzharPref";
private static final String IS_LOGIN = "IsLoggedIn";
public static final String KEY_NAME = "name";
public static final String KEY_EMAIL = "email";
@SuppressLint("CommitPrefEdits")
public SessionManager(Context context) {
this.context = context;
pref = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
public void createLoginSession(String email) {
editor.putBoolean(IS_LOGIN, true);
editor.putString(KEY_EMAIL, email);
editor.commit();
}
public void checkLogin() {
if (!this.isLoggedIn()) {
Intent i = new Intent(context, LoginActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
public HashMap<String, String> getUserDetails() {
HashMap<String, String> user = new HashMap<>();
user.put(KEY_NAME, pref.getString(KEY_NAME, null));
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
return user;
}
public void logoutUser() {
editor.clear();
editor.commit();
Intent i = new Intent(context, LoginActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
public boolean isLoggedIn() {
return pref.getBoolean(IS_LOGIN, false);
}
}
10. Buat DatabaseHelper.java
Fungsinya menyimpan hasil infput dari form menu Booking.
package com.wijaba.travel.database;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "db_travel";
public static final String TABLE_USER = "tb_user";
public static final String COL_USERNAME = "username";
public static final String COL_PASSWORD = "password";
public static final String COL_NAME = "name";
public static final String TABLE_BOOK = "tb_book";
public static final String COL_ID_BOOK = "id_book";
public static final String COL_ASAL = "asal";
public static final String COL_TUJUAN = "tujuan";
public static final String COL_TANGGAL = "tanggal";
public static final String COL_DEWASA = "dewasa";
public static final String COL_ANAK = "anak";
public static final String TABLE_HARGA = "tb_harga";
public static final String COL_HARGA_DEWASA = "harga_dewasa";
public static final String COL_HARGA_ANAK = "harga_anak";
public static final String COL_HARGA_TOTAL = "harga_total";
private SQLiteDatabase db;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("PRAGMA foreign_keys=ON");
db.execSQL("create table " + TABLE_USER + " (" + COL_USERNAME + " TEXT PRIMARY KEY, " + COL_PASSWORD +
" TEXT, " + COL_NAME + " TEXT)");
db.execSQL("create table " + TABLE_BOOK + " (" + COL_ID_BOOK + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COL_ASAL + " TEXT, " + COL_TUJUAN + " TEXT" + ", " + COL_TANGGAL + " TEXT, " + COL_DEWASA + " TEXT, "
+ COL_ANAK + " TEXT)");
db.execSQL("create table " + TABLE_HARGA + " (" + COL_USERNAME + " TEXT, " + COL_ID_BOOK + " INTEGER, " +
COL_HARGA_DEWASA + " TEXT, " + COL_HARGA_ANAK + " TEXT, " + COL_HARGA_TOTAL +
" TEXT, FOREIGN KEY(" + COL_USERNAME + ") REFERENCES " + TABLE_USER
+ ", FOREIGN KEY(" + COL_ID_BOOK + ") REFERENCES " + TABLE_BOOK + ")");
db.execSQL("insert into " + TABLE_USER + " values ('azhar@gmail.com','azhar','Azhar Rivaldi');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
onCreate(db);
}
public void open() throws SQLException {
db = this.getWritableDatabase();
}
public boolean Register(String username, String password, String name) throws SQLException {
@SuppressLint("Recycle") Cursor mCursor = db.rawQuery("INSERT INTO " + TABLE_USER + "(" + COL_USERNAME + ", " + COL_PASSWORD + ", " + COL_NAME + ") VALUES (?,?,?)", new String[]{username, password, name});
if (mCursor != null) {
return mCursor.getCount() > 0;
}
return false;
}
public boolean Login(String username, String password) throws SQLException {
@SuppressLint("Recycle") Cursor mCursor = db.rawQuery("SELECT * FROM " + TABLE_USER + " WHERE " + COL_USERNAME + "=? AND " + COL_PASSWORD + "=?", new String[]{username, password});
if (mCursor != null) {
return mCursor.getCount() > 0;
}
return false;
}
}
11. Buat HistoryAdapter.java dan HistoryModel.java
Untuk mengambil list data dan mengimplementasikan apa saja yang akan tampil dan disimpan ke database.
HistoryAdapter.java
package com.wijaba.travel.adapter;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.wijaba.travel.R;
import com.wijaba.travel.model.HistoryModel;
import java.util.ArrayList;
public class HistoryAdapter extends ArrayAdapter<HistoryModel> {
public HistoryAdapter(Activity context, ArrayList<HistoryModel> notification) {
super(context, 0, notification);
}
@SuppressLint("SetTextI18n")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_item_booking, parent, false);
}
HistoryModel current = getItem(position);
TextView idBook = listItemView.findViewById(R.id.id_booking);
idBook.setText("ID : " + current.getIdBook());
TextView tanggal = listItemView.findViewById(R.id.tanggal);
tanggal.setText(current.getTanggal());
TextView riwayat = listItemView.findViewById(R.id.riwayat);
riwayat.setText(current.getRiwayat());
TextView tvTotal = listItemView.findViewById(R.id.tv_total);
tvTotal.setText("Total :");
TextView total = listItemView.findViewById(R.id.total);
total.setText("Rp. " + current.getTotal());
ImageView imageIcon = listItemView.findViewById(R.id.image);
if (current.hasImage()) {
imageIcon.setImageResource(current.getImageResourceId());
imageIcon.setVisibility(View.VISIBLE);
} else {
imageIcon.setVisibility(View.GONE);
}
return listItemView;
}
}
HistoryModel.java
package com.wijaba.travel.model;
public class HistoryModel {
private String mIdBook;
private String mTanggal;
private String mRiwayat;
private String mTotal;
private int mImageResourceId;
private static final int NO_IMAGE_PROVIDED = -1;
public HistoryModel(String idBook, String tanggal, String riwayat, String total, int imageResourceId) {
mIdBook = idBook;
mTanggal = tanggal;
mRiwayat = riwayat;
mTotal = total;
mImageResourceId = imageResourceId;
}
public String getIdBook() {
return mIdBook;
}
public String getTanggal() {
return mTanggal;
}
public String getRiwayat() {
return mRiwayat;
}
public String getTotal() {
return mTotal;
}
public int getImageResourceId() {
return mImageResourceId;
}
public boolean hasImage() {
return mImageResourceId != NO_IMAGE_PROVIDED;
}
}
Setelah sudah mengikuti langkah-langkah diatas dengan baik, tinggal
kalian Run saja. InsyaAllah akan berhasil seperti gambar dibawah ini.
Jika kalian mendapati error silahkan kalian cek kembali, jika sudah
di cek masih error silahkan kalian berkomentar dibawah agar kita bisa
diskusikan bersama.
Jika kalian ingin langsung source codenya tanpa tutorial diatas silahkan didownload disini
Sekian tutorial Cara Membuat Aplikasi Android Pemesanan Travel Menggunakan Android Studio Dengan Database SQLite semoga bermanfaat. Dan jangan lupa membagikan artikel ini kepada
teman-teman kalian yang ingin belajar membuat aplikasi Android
sederhana, jangan pelit ilmu pokoknya.
Post a Comment for "Cara Membuat Aplikasi Android Pemesanan Travel Menggunakan Android Studio Dengan Database SQLite"