0% menganggap dokumen ini bermanfaat (0 suara)
240 tayangan46 halaman

Modul Pertemuan 10 Proyek Data Persistence PDF

Modul pelatihan ini memberikan instruksi untuk membuat dua aplikasi sederhana yaitu aplikasi catatan harian dan validasi login menggunakan data persistence. Aplikasi pertama dapat menyimpan dan menampilkan catatan harian sedangkan yang kedua digunakan untuk validasi login pengguna.

Diunggah oleh

Adam Coy
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
240 tayangan46 halaman

Modul Pertemuan 10 Proyek Data Persistence PDF

Modul pelatihan ini memberikan instruksi untuk membuat dua aplikasi sederhana yaitu aplikasi catatan harian dan validasi login menggunakan data persistence. Aplikasi pertama dapat menyimpan dan menampilkan catatan harian sedangkan yang kedua digunakan untuk validasi login pengguna.

Diunggah oleh

Adam Coy
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 46

MODUL PELATIHAN

JUNIOR MOBILE PROGRAMMER

PERTEMUAN 10
Proyek : Aplikasi Data Persistence Pada Mobile

KEMENTERIAN KOMUNIKASI DAN INFORMATIKA R.I.


BADAN PENELITIAN DAN PENGEMBANGAN SUMBER DAYA MANUSIA
PUSAT PENGEMBANGAN PROFESI DAN SERTIFIKASI
Jl. Medan Merdeka Barat No.9 Jakarta 10110
2019

KATA PENGANTAR
Alhamdulillahirobbila’lamin. Puji syukur kepada Allah SWT, Tuhan Yang Maha Kuasa, yang telah memberikan
rahmat-Nya sehingga Modul Pelatihan Junior Mobile Programmer Pertemuan ke-10 Proyek Aplikasi Data
Persistence Pada Mobile ini dapat diselesaikan dengan sebaik-baiknya.

Modul pelatihan ini diharapkan dapat membantu peserta dalam memahami topik data persistence pada pertemuan
ke-9. Modul pelatihan berisi instruksi untuk membuat aplikasi sederhana dengan memanfaatkan data persistence.

Penyusun menyakini bahwa dalam pembuatan modul pelatihan ini masih jauh dari sempurna. Oleh karena itu
penyusun mengharapkan kritik dan saran yang membangun guna penyempurnaan modul pelatihan ini dimasa yang
akan datang.

Akhir kata, penyusun mengucapkan banyak terima kasih kepada semua pihak yang telah membantu baik secara
langsung maupun tidak langsung.

2
DAFTAR ISI

KATA PENGANTAR ................................................................................................................................................. 1

1. PENDAHULUAN ............................................................................................................................................... 4

2. APLIKASI CATATAN HARIAN .....................................................................................................................5

3. APLIKASI VALIDASI LOGIN ...................................................................................................................... 25

4. KESIMPULAN ................................................................................................................................................. 45

5. TIM PENYUSUN .............................................................................................................................................. 46

3
1. PENDAHULUAN

Setelah mempelajari data persistence pada pertemuan sebelumnya, di sesi ini anda akan membuat proyek aplikasi
sederhana dengan memanfaatkan data persistence. Proyek aplikasi yang akan dibuat adalah :

1. Aplikasi catatan harian.


2. Aplikasi validasi login.

Untuk selanjutnya anda dapat mengikuti langkah demi langkah sesuai instruksi pada halaman selanjutnya.

4
2. APLIKASI CATATAN HARIAN

Pada Proyek 1, anda akan membuat aplikasi catatan harian yang akan menyimpan catatan harian anda pada file teks.
Catatan harian yang disimpan berupa nama file dan isi catatan. Semua catatan yang telah disimpan akan
dimunculkan dalam bentuk list. Pertama kali dijalankan aplikasi akan memunculkan splahscreen, lalu akan masuk
ke halaman utama yang berisi daftar catatan yang telah dibuat. Aplikasi ini memiliki fungsional untuk menambah
catatan, mengubah, menghapus, dan membaca daftar catatan.

Proyek ini merupakan latihan implementasi untuk penyimpanan file (data persistence) menggunakan external
storage. Untuk lebih jelasnya silahkan perhatikan beberapa tampilan berikut ini :

Gambar 1. Tampilan Splashscreen Gambar 2. Tampilan Halaman Utama Gambar 3. Tampilan Halaman Tambah Gambar 4. Tampilan Konfirmasi Hapus
Catatan Catatan

Selanjutnya ikutilah instruksi berikutnya untuk membuat aplikasi tersebut.

5
Membuat Proyek Baru

1. Buatlah sebuah proyek baru pada android studio, dan berikan nama pada proyek yang akan anda buat
(sebagai contoh Proyek1). Jangan lupa pastikan project ini menggunakan java 1.8, sehingga bisa
menggunakan lambda expression.

Gambar 5. Tambahkan Proyek Baru (Add No Activity)

Kemudian buat project dengan ketentuan berikut :

Name : Proyek1
Package Name : kominfo.go.id.storage.proyek1
Save Location : D:\Android-Latihan\Proyek1 (sesuaikan)
Language : Java
Minimum API Level : API 21: Android 5.0 (Lollipop)

Pastikan API level minimumnya adalah API 21.

6
Gambar 6. Tuliskan nama proyek dan package

Membuat Halaman Splashscreen


2. Buatlah sebuah Activity, beri nama kelas SplashScreen.java beserta file layout dengan nama
activity_splash_screen.xml.

7
Gambar 7. Tambahkan Activity SplashScreen

3. Desainlah sebuah tampilan pada activity_splash_screen sebagaimana berikut ini :

Gambar 8. Desain Tampilan SplashScreen

8
Gambar 9. Struktur Layout Komponennya

4. Sesuaikan kode xml pada activity_splash_screen.xml sebagaimana berikut :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashScreen">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="PROYEK 1"
android:textColor="#000"
android:textSize="30sp"
tools:ignore="HardcodedText" />
</LinearLayout>

</RelativeLayout>

5. Pada kelas Java SplashScreen.java, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek1;

import android.content.Intent;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class SplashScreen extends AppCompatActivity {

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

9
new Handler().postDelayed(() -> {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}, 3000);
}
}

Membuat Halaman Main (Utama)

6. Buatlah sebuah Activity, beri nama kelas MainActivity.java beserta file layout dengan nama
activity_main.xml.

Gambar 10. Tambahkan MainActivity dan Layout activity_main

7. Desainlah sebuah tampilan View pada activity_main sebagaimana berikut :

10
Gambar 11. Desain Tampilan pada activity_main

Gambar 12. Struktur Layout pada activity_main

8. Sesuaikan kode xml pada activity_main.xml sebagaimana berikut :


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

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"/>

</LinearLayout>

11
9. Buat file menu.xml sebagai menu pada folder res > menu dan sesuai kode xmlnya sebagai berikut :

<?xml version="1.0" encoding="utf-8"?>


<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=".MainActivity">

<item
android:id="@+id/miTambah"
android:icon="@android:drawable/ic_menu_add"
android:orderInCategory="300"
android:title="Tambah"
app:showAsAction="ifRoom"></item>

</menu>

Sehingga hasilnya hasil desainnya seperti berikut

10. Pada kelas Java MainActivity.java, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek1;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import androidx.annotation.NonNull;

12
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class MainActivity extends AppCompatActivity {


public static final int REQUEST_CODE_STORAGE = 100;
private ListView listView;

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

//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setTitle("Aplikasi Catatan Proyek 1");

listView = findViewById(R.id.listView);

//event handler listView onClick


listView.setOnItemClickListener((parent, view, position, id) -> {

//convert object to Map


Map<String, Object> data = (Map<String, Object>) parent.getAdapter().getItem(position);

//aktifkan kelas InsertAndViewActivity melalui explicit intent - with data


Intent intent = new Intent(this, InsertAndViewActivity.class);
intent.putExtra("filename", data.get("name").toString());
startActivity(intent);
});

//lisView longClick
listView.setOnItemLongClickListener((parent, view, position, id) -> {
//convert object to Map
Map<String, Object> data = (Map<String, Object>) parent.getAdapter().getItem(position);

String namaFile = data.get("name").toString();

//tampilkan dialog konfirmasi hapus


new AlertDialog.Builder(this)
.setTitle("Konfirmasi hapus")
.setMessage(String.format("hapus catatan %s", namaFile))
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("YES", (dialog, whichButton) -> hapusFile(namaFile))
.setNegativeButton("NO", null).show();

return true;
});

@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
showListFiles();
}
} else {

13
showListFiles();
}
}

public boolean periksaIzinPenyimpanan() {


if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
return true;
}
else {
ActivityCompat.requestPermissions(this,
new String[]{WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_STORAGE);

return false;
}
} else {
return true;
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_STORAGE)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showListFiles();
}
}

void showListFiles() {
String path = Environment.getExternalStorageDirectory() + "/kominfo.proyek1";
File directory = new File(path);

if (directory.exists()) {
File[] files = directory.listFiles();
String[] filenames = new String[files.length];
String[] dateCreated = new String[files.length];
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM YYYY HH:mm:ss");
ArrayList<Map<String, Object>> itemDataList = new ArrayList<Map<String, Object>>();

for (int i = 0; i < files.length; i++) {


filenames[i] = files[i].getName();
Date lastModDate = new Date(files[i].lastModified());
dateCreated[i] = simpleDateFormat.format(lastModDate);

Map<String, Object> listItemMap = new HashMap<>();


listItemMap.put("name", filenames[i]);
listItemMap.put("date", dateCreated[i]);
itemDataList.add(listItemMap);
}

SimpleAdapter simpleAdapter = new SimpleAdapter(this,


itemDataList, android.R.layout.simple_list_item_2,
new String[]{"name", "date"},
new int[]{android.R.id.text1, android.R.id.text2});

listView.setAdapter(simpleAdapter);
simpleAdapter.notifyDataSetChanged();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}

14
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.miTambah)
//aktifkan InsertAndViewActivity via explicit intent - non data
startActivity(new Intent(this, InsertAndViewActivity.class));

return super.onOptionsItemSelected(item);
}

void hapusFile(String filename) {


String path = Environment.getExternalStorageDirectory().toString() + "/kominfo.proyek1";
File file = new File(path, filename);
if (file.exists() && file.delete())
System.out.println("file telah dihapus");

showListFiles();
}
}

Membuat Halaman Tambah Catatan

11. Selanjutnya, tambahkan Activity baru, berikan nama Activity dengan InsertAndViewActivity, serta nama
layout activity_insert_and_view.

Gambar 13. Tambahkan InsertAndViewActivity

15
12. Buatlah sebuah desain layout, dengan tampilan sebagaimana berikut :

Gambar 14. Desain Tampilan InsertAndViewActivity

Gambar 15. Struktur Layout InsertAndViewActivity

13. Sesuaikan kode xml pada layout activity_insert_and_view sebagaimana kode berikut :

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

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="Nama File : "
android:layout_marginTop="20dp"
android:textColor="#000"
android:textSize="12sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etFilename"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:padding="5dp"
android:singleLine="true"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor,TextFields" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:text="Catatan : "
android:textColor="#000"
android:textSize="12sp"
tools:ignore="HardcodedText" />

<EditText

17
android:id="@+id/etContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:gravity="top|start"
android:background="#E6DFDF"
android:singleLine="false"
android:padding="5dp"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor,TextFields" />

<Button
android:id="@+id/btSimpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@color/colorPrimary"
android:text="Simpan"
android:textAllCaps="false"
android:textColor="#FFF"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>

</LinearLayout>

14. Pada kelas java InsertAndViewActivity, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek1;

import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class InsertAndViewActivity extends AppCompatActivity {

18
public static final int REQUEST_CODE_STORAGE = 100;
private int eventID = 0;
private EditText etFileName;
private EditText etContent;
//boolean isEditable = false;
private String tempCatatan = "";

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

//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}

etFileName = findViewById(R.id.etFilename);
etContent = findViewById(R.id.etContent);
Button btSimpan = findViewById(R.id.btSimpan);

String fileName;

//event handler
btSimpan.setOnClickListener(v -> {
eventID = 2;
if (!tempCatatan.equals(etContent.getText().toString())) {
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
tampilSaveDialog();
}
} else {
tampilSaveDialog();
}
}
});

//check bundle dari intent


if (getIntent().getExtras() != null && !getIntent().getExtras().isEmpty()) {
fileName = getIntent().getExtras().getString("filename");
etFileName.setText(fileName);
getSupportActionBar().setTitle("Ubah Catatan");
} else {
getSupportActionBar().setTitle("Tambah Catatan");
}

eventID = 1;
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
bacaFile();
}
} else {
bacaFile();
}
}

public boolean periksaIzinPenyimpanan() {


if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
{
return true;
} else {
ActivityCompat.requestPermissions(this,
new String[]{WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_STORAGE);

19
return false;
}
} else {
return true;
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == REQUEST_CODE_STORAGE && grantResults[0] ==


PackageManager.PERMISSION_GRANTED)
if (eventID == 1)
bacaFile();
else
tampilSaveDialog();
}

void bacaFile() {
String path = Environment.getExternalStorageDirectory().toString() + "/kominfo.proyek1";
File file = new File(path, etFileName.getText().toString());
if (file.exists()) {

StringBuilder text = new StringBuilder();

try {
BufferedReader br = new BufferedReader(new FileReader(file));

String line = br.readLine();

while (line != null) {


text.append(line);
line = br.readLine();
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}

tempCatatan = text.toString();
etContent.setText(text.toString());
}
}

void buatDanUbah() {
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}

String path = Environment.getExternalStorageDirectory().toString() + "/kominfo.proyek1";


File parent = new File(path);

if (parent.exists()) {
File file = new File(path, etFileName.getText().toString());

try (FileOutputStream fos = new FileOutputStream(file);


OutputStreamWriter osw = new OutputStreamWriter(fos)) {

osw.append(etContent.getText());
osw.flush();
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}

20
else {

if(parent.mkdir()) return;

File file = new File(path, etFileName.getText().toString());


try (FileOutputStream fos = new FileOutputStream(file, false)) {
fos.write(etContent.getText().toString().getBytes());
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}

onBackPressed();
}

void tampilSaveDialog() {
new AlertDialog.Builder(this)
.setTitle("Simpan Catatan")
.setMessage("Apakah Anda yakin ingin menyimpan Catatan ini?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("YES", (dialog, whichButton) -> buatDanUbah())
.setNegativeButton("NO", null).show();
}

@Override
public void onBackPressed() {
if (!tempCatatan.equals(etContent.getText().toString())) {
tampilSaveDialog();
}
super.onBackPressed();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
}

15. Jalankan aplikasi tersebut, lalu ujilah fungsionalitasnya baik untuk fungsi tambah, ubah, hapus, dan baca
data.

Gambar 16. Tampilan Awal Aplikasi Catatan Harian

21
Gambar 17. Tampilan Form Tambah Catatan

Gambar 18. Tampilan Saat Catatan telah disimpan

22
Gambar 19. Tampilan Form Ubah Catatan

Gambar 20. Tampilan saat Hapus Catatan (ada konfirmasi hapus)

23
Catatan : Untuk menghapus data, tekan beberapa detik pada list, maka akan muncul konfirmasi hapus.

 Selamat, anda telah berhasil mengerjakan Proyek 1 

24
3. APLIKASI VALIDASI LOGIN

Pada Proyek 2, anda akan membuat aplikasi validasi login yang akan melakukan pengecekan terhadap data user
yang tersimpan pada file teks. Pertama kali dijalankan aplikasi akan memunculkan splahscreen, apabila user belum
teregistrasi, maka dapat melakukan registrasi pada halaman registrasi, apabila sudah memiliki akun dapat login
menggunakan akun tersebut pada halaman login. Setelah berhasil login, aplikasi akan masuk ke halaman utama yang
memunculkan data user. Tersedia juga tombol logout untuk keluar dari aplikasi.

Proyek ini merupakan latihan implementasi untuk penyimpanan file (data persistence) menggunakan internal
storage. Untuk lebih jelasnya silahkan perhatikan beberapa tampilan berikut ini :

Gambar 21. Tampilan Splashscreen Gambar 22. Tampilan Halaman Login Gambar 23. Tampilan Halaman Register Gambar 24. Tampilan Halaman Home

Untuk selanjutnya ikut langkah-langkah berikut dalam membangun aplikasi tersebut.

Membuat Proyek Baru


16. Buatlah sebuah proyek baru pada android studio, dan berikan nama pada proyek yang akan anda buat
(sebagai contoh Proyek2).

25
Gambar 25. Tambahkan Proyek Baru (Add No Activity)

26
Gambar 26. Tuliskan nama proyek dan package

Membuat Halaman Splashscreen


17. Buatlah sebuah Activity, beri nama kelas SplashScreen.java beserta file layout dengan nama
activity_splash_screen.xml.

27
Gambar 27. Tambahkan Activity SplashScreen

18. Desainlah sebuah tampilan pada activity_splash_screen sebagaimana berikut ini :

Gambar 28. Desain Tampilan SplashScreen

28
Gambar 29. Struktu Layout Komponennya

19. Sesuaikan kode xml pada activity_splash_screen.xml sebagaimana berikut :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashScreen">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="PROYEK 2"
android:textColor="#000"
android:textSize="30sp"
tools:ignore="HardcodedText" />
</LinearLayout>

</RelativeLayout>

20. Pada kelas Java SplashScreen.java, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek2;

import android.content.Intent;
import android.os.Bundle;

29
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;

public class SplashScreen extends AppCompatActivity {

public static final String FILENAME = "login";

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

new Handler().postDelayed(() -> {

if (isLogin()) {
Intent intent = new Intent(SplashScreen.this, MainActivity.class);
startActivity(intent);
} else {
Intent intent = new Intent(SplashScreen.this, LoginActivity.class);
startActivity(intent);
}

finish();
}, 3000);
}

boolean isLogin() {
File sdcard = getFilesDir();
File file = new File(sdcard, FILENAME);
return file.exists();
}

Membuat Halaman Login


21. Buatlah sebuah Activity, beri nama kelas LoginActivity.java beserta file layout dengan nama
activity_login.xml.

30
Gambar 30. Tambahkan LoginActivity dan Layout activity_login

22. Desainlah sebuah tampilan pada activity_login sebagaimana berikut :

Gambar 31. Desain Tampilan pada activity_login

31
Gambar 32. Struktur Layout pada activity_main

23. Sesuaikan kode xml pada activity_login.xml sebagaimana berikut :


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF"
android:orientation="vertical"
android:padding="20dp"
tools:context=".LoginActivity">

<ImageView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Password"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

32
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPassword"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<Button
android:id="@+id/btLogin"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@color/colorPrimary"
android:text="Login"
android:textColor="#FFF"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />

<Button
android:id="@+id/btRegister"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@color/colorPrimary"
android:text="Register"
android:textColor="#FFF"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />

</LinearLayout>

24. Pada kelas Java LoginActivity.java, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek2;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

public class LoginActivity extends AppCompatActivity {


public static final String FILENAME = "login";
private EditText etUsername;
private EditText etPassword;

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

//views to object
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
Button btLogin = findViewById(R.id.btLogin);
Button btRegister = findViewById(R.id.btRegister);

33
//event handler
btLogin.setOnClickListener(v -> login());

btRegister.setOnClickListener(v -> {
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
});
}

void simpanFileLogin() {
String isiFile = etUsername.getText().toString() + ";" + etPassword.getText().toString();
File file = new File(getFilesDir(), FILENAME);

try (FileOutputStream fos = new FileOutputStream(file, false)) {


fos.write(isiFile.getBytes());
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}

Toast.makeText(this, "Login Berhasil", Toast.LENGTH_SHORT).show();


//keluar dari LoginActivity
onBackPressed();
}

void login() {
File sdcard = getFilesDir();
File file = new File(sdcard, etUsername.getText().toString());

if (file.exists()) {

StringBuilder text = new StringBuilder();


try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line = br.readLine();

while (line != null) {


text.append(line);
line = br.readLine();
}
} catch (IOException e) {
System.out.println("Error " + e.getMessage());
}

String data = text.toString();

//split String to array String


String[] dataUser = data.split(";");

if (dataUser[1].equals(etPassword.getText().toString())) {
simpanFileLogin();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(this, "Password Tidak Sesuai", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "User Tidak Ditemukan", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onBackPressed() {

//konfirmasi ketika menutup halaman login


new AlertDialog.Builder(this)
.setTitle("close confirmation")
.setMessage("close this app?")
.setIcon(android.R.drawable.ic_lock_power_off)
.setCancelable(true)

34
.setPositiveButton("YES", (dialog, which) -> finish())
.setNegativeButton("NO", null).show();
}
}

Membuat Halaman Register

25. Selanjutnya, tambahkan Activity baru, berikan nama Activity dengan RegisterActivity, serta nama layout
activity_register.

Gambar 33. Tambahkan RegisterActivity

26. Buatlah sebuah desain layout, dengan tampilan sebagaimana berikut :

35
Gambar 34. Desain Tampilan RegisterActivity

Gambar 35. Struktur Layout RegisterActivity

27. Sesuaikan kode xml activity_register.xml sebagaimana berikut ini :

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

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:ignore="ScrollViewSize">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:digits="abcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Password"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

37
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPassword"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Email"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textEmailAddress"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Nama Lengkap"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etNamaLengkap"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPersonName"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Asal Sekolah"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

38
<EditText
android:id="@+id/etAsalSekolah"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPersonName"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Alamat Tinggal"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />

<EditText
android:id="@+id/etAlamat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:gravity="top|start"
android:lines="3"
android:padding="5dp"
android:singleLine="false"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />

<Button
android:id="@+id/btSimpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@color/colorPrimary"
android:text="Simpan"
android:textColor="#FFF"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</ScrollView>

</LinearLayout>

28. Pada kelas Java RegisterActivity.java, tambahkan kode berikut ini :


package kominfo.go.id.storage.proyek2;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

39
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import java.io.File;
import java.io.FileOutputStream;

public class RegisterActivity extends AppCompatActivity {


private EditText etUsername;
private EditText etPassword;
private EditText etEmail;
private EditText etNamaLengkap;
private EditText etAsalSekolah;
private EditText etAlamat;

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

//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setTitle("Register");
}

etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
etEmail = findViewById(R.id.etEmail);
etNamaLengkap = findViewById(R.id.etNamaLengkap);
etAsalSekolah = findViewById(R.id.etAsalSekolah);
etAlamat = findViewById(R.id.etAlamat);

//event handler
Button btSimpan = findViewById(R.id.btSimpan);

btSimpan.setOnClickListener(v -> {
if (isValidation())
simpanFileData();
else
Toast.makeText(this, "Mohon Lengkapi Seluruh Data", Toast.LENGTH_SHORT).show();
});
}

boolean isValidation() {
EditText[] ets = new EditText[]{
etUsername,
etPassword,
etEmail,
etNamaLengkap,
etAlamat,
etAsalSekolah
};

for (EditText et : ets)


if (et.getText().toString().isEmpty())
return true;

return false;
}

void simpanFileData() {
EditText[] ets = new EditText[]{
etUsername,
etPassword,
etEmail,
etNamaLengkap,
etAlamat,
etAsalSekolah

40
};

String isiFile = "";


for(EditText et : ets)
isiFile.concat(et.getText().toString() + ";");

File file = new File(getFilesDir(), etUsername.getText().toString());

try (FileOutputStream fos = new FileOutputStream(file, false)) {


fos.write(isiFile.getBytes());
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}

Toast.makeText(this, "Register Berhasil", Toast.LENGTH_SHORT).show();


onBackPressed();
}
}

29. Selanjutnya tambahkan kode java MainActivity sebagaimana berikut ini :


package kominfo.go.id.storage.proyek2;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {


private EditText etUsername;
private EditText etEmail;
private EditText etNamaLengkap;
private EditText etAsalSekolah;
private EditText etAlamat;

//local
EditText etPassword;
Button btSimpan;
TextView tvPassword;

public static final String FILENAME = "login";

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

//views to object

41
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

if (getSupportActionBar() != null) getSupportActionBar().setTitle("Halaman


Depan");

etUsername = findViewById(R.id.etUsername);
tvPassword = findViewById(R.id.tvPassword);
etPassword = findViewById(R.id.etPassword);
etEmail = findViewById(R.id.etEmail);
etNamaLengkap = findViewById(R.id.etNamaLengkap);
etAsalSekolah = findViewById(R.id.etAsalSekolah);
etAlamat = findViewById(R.id.etAlamat);
btSimpan = findViewById(R.id.btSimpan);

etUsername.setEnabled(false);
tvPassword.setVisibility(View.GONE);
etPassword.setVisibility(View.GONE);
etEmail.setEnabled(false);
etNamaLengkap.setEnabled(false);
etAsalSekolah.setEnabled(false);
etAlamat.setEnabled(false);

btSimpan.setVisibility(View.GONE);

bacaFileLogin();
}

void bacaFileLogin() {
File sdcard = getFilesDir();
File file = new File(sdcard, FILENAME);

if (file.exists()) {
StringBuilder text = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line = br.readLine();
while (line != null) {
text.append(line);
line = br.readLine();
}
} catch (IOException e) {
System.out.println("Error " + e.getMessage());
}

String data = text.toString();


String[] dataUser = data.split(";");
bacaDataUser(dataUser[0]);
}
}

void bacaDataUser(String fileName) {


File sdcard = getFilesDir();
File file = new File(sdcard, fileName);

if (file.exists()) {
StringBuilder text = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line = br.readLine();
while (line != null) {
text.append(line);
line = br.readLine();
}
} catch (IOException e) {

42
System.out.println("Error " + e.getMessage());
}

String data = text.toString();


String[] dataUser = data.split(";");

etUsername.setText(dataUser[0]);
etEmail.setText(dataUser[2]);
etNamaLengkap.setText(dataUser[3]);
etAsalSekolah.setText(dataUser[4]);
etAlamat.setText(dataUser[5]);

} else
Toast.makeText(this, "User Tidak Ditemukan", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.miLogout)
showLogoutDialog();

return super.onOptionsItemSelected(item);
}

void hapusFile() {
File file = new File(getFilesDir(), FILENAME);

if (file.exists() && file.delete())


System.out.println("file telah dihapus");
}

void showLogoutDialog() {
new AlertDialog.Builder(this)
.setTitle("Confirmation Logout")
.setMessage("Anda yakin ingin Logout?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("YES", (dialog, whichButton) -> {
hapusFile();

Intent intent = new Intent(this, LoginActivity.class);


startActivity(intent);
finish();
})
.setNegativeButton("NO", null).show();
}
}

Menguji Aplikasi Proyek 2

30. Selanjutnya Jalankan aplikasi tersebut, lalu ujilah fungsionalitasnya baik untuk melakukan registrasi, login
dan logout.

43
 Selamat, anda telah berhasil mengerjakan Proyek 2 

44
4. KESIMPULAN

Sampai dengan tahap ini anda telah menyelesaikan 2 (dua) proyek aplikasi yang terkait dengan data persistence.
Pada aplikasi Proyek1, anda membuat aplikasi catatan harian dimana proses penyimpanannya menggunakan
external storage. Sedangkan pada aplikasi Proyek2, anda membuat aplikasi validasi login, dimana data user
disimpan pada internal storage. Dengan mempelajari kedua aplikasi tersebut, diharapkan anda sudah memahami
dengan baik fungsi data persistence, dan pemanfaatannya untuk aplikasi Android. Data persistence dapat
digunakan untuk menyimpan data apapun sesuai kebutuhan dalam bentuk file. Data ini bersifat tetap dan tidak
akan hilang selama tidak dihapus.

Demikian modul ini dibuat sebagai bahan pembelajaran untuk memahami implementasi secara praktis
pemanfaatan data persistence, semoga bermanfaat.

Notes : source code (project dapat di download di

 Proyek1 – Aplikasi Catatan Harian, https://github.com/rmantala/Proyek1


 Proyek2 – Aplikasi Validasi Login, https://github.com/rmantala/Proyek2

45
5. TIM PENYUSUN

1. Syamsi Dwi Cahya, S.S.T, M.Kom (Politeknik Negeri Jakarta)


2. Ghifari Munawar, S.Kom., M.T (Politeknik Negeri Bandung)

46

Anda mungkin juga menyukai