Showing posts with label android. Show all posts
Showing posts with label android. Show all posts

Tuesday, December 7, 2021

Bedah kode Aplikasi Storage di Android

Storage/Media penyimpanan merupakan hal yang penting pada aplikasi berbasis mobile, salah satunya di Android. Berdasarkan data penyimpanan, di Android terdapat 2 jenis yaitu: data temporary dan data persistence. Data temporary umumnya diproses melalui internal storage dalam bentuk cache, sedangkan data persistence disimpan secara permanen dalam suatu file.

Pada artikel ini akan kita bahas jenis yang kedua yaitu data persistence. Android menyediakan beberapa solusi untuk menangani data persistence, tergantung dari sifatnya apakah private atau public. Beberapa solusi yang dipilih harus sesuai dengan kebutuhan spesifiknya, seperti apakah data yang disimpan akan bersifat private atau boleh diakses secara bebas (public) serta berapa banyak space yang dibutuhkannya. Selain itu, Android juga menyediakan cara untuk membuka data private ke aplikasi lain (apabila diperlukan), melalui Content Provider (inshaAllah akan dibahas di posting lainnya).

Images are taken from flaticon

Storage data persistence ini terbagi lagi menjadi 2 yaitu: 
  • Internal storage: direktori private yang hanya diakses pada aplikasi itu sendiri.
  • External storage: direktori public dapat diakses secara lebih luas pada aplikasi itu sendiri dan aplikasi lainnya.
Karakteristik internal storage:
  • Selalu tersedia/dapat diakses.
  • Menggunakan file sistem dari device.
  • Hanya bisa diakses pada aplikasi itu sendiri, kecuali secara eksplisit diatur agar dapat dibaca/tulis.
  • Saat aplikasi di-uninstall/clear data, sistem akan menghapus data di internal strorage.
Karakteristik exsternal storage:
  • Tidak selalu tersedia/dapat dihapus.
  • Menggunakan file sistem dari device atau external seperti SdCard.
  • World-readable, semua aplikasi dapat membaca.
  • Saat aplikasi di-uninstall, sistem tidak menghapus file tersebut.

Bedah kode aplikasi MyStorage

Langkah awal dengan membuat project baru di Android Studio, disini saya menggunakan nama aplikasi MyStorage dengan nama package net.ariflaksito.mystorage, minimal SDK adalah Android 5.0. Setelah itu di kita akan membuat contoh penggunaan internal dan external storage, pada MainActivity akan saya buat dua tombol untuk menuju ke activity InStorageActivity dan ExStorageActivity menggunakan Intent.

Jika anda ingin memahami lebih detail tentang Intent bisa disimak video berikut ini:


Silahkan anda siapkan layout seperti pada tampilan dibawah ini:

Tampilan awal MainActivity

Setelah itu kita bisa membuat 2 activity baru (Empty Activity) dengan nama : InStorageActivity dan ExStorageActivity. Untuk layout kedua activity tersebut, kita siapkan 4 Button dan 1 TextView seperti pada tampilan berikut :

Tampilan layout editor file

Untuk kode dari layout tersebut seperti dibawah ini:

Pada kode xml diatas kita perlu tambahkan beberapa resource di file strings.xml karena data-data text kita simpan di file res/values/strings.xml. Jika nanti diperlukan localize resource seperti aplikasi yang support multi bahasa lebih mudah dalam me-manage string tersebut.

Kode Activity Internal Storage

Selanjutnya kita edit bagian inStorageActivity. Pertama kita tambahkan class attribut nama-file, button dan textview seperti ini:

public static final String FILENAME = "myfile.txt";
Button btnCreate, btnEdit, btnRead, btnDelete;
TextView tvRead;

Selanjutnya kita set masing-masing komponen tersebut dan kita tambahkan label untuk ActionBar pada method onCreate( ) seperti berikut:

String title = getResources().getString(R.string.title_in_storage);
getSupportActionBar().setTitle(title);

btnCreate = findViewById(R.id.btn_create_file);
btnEdit = findViewById(R.id.btn_edit_file);
btnRead = findViewById(R.id.btn_read_file);
btnDelete = findViewById(R.id.btn_del_file);
tvRead = findViewById(R.id.tv_read);

Selanjutnya kita buat 4 method baru untuk menjalankan masing-masing fungsi, yaitu: createFile( ), editFile( ), readFile( ) dan deleteFile( ). Pada model internal storage kita gunakan fungsi getFilesDir( ) untuk meng-akses path dari storage. Untuk kode method createFile( ) seperti berikut:

void createFile() {
String isiFile = "Hello world!";
File file = new File(getFilesDir(), FILENAME);

FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file, true);
outputStream.write(isiFile.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Secara lengkap kode fungsi-fungsi yang lain dalam Activity tersebut seperti berikut:

Lokasi/path dari myfile.txt tersebut pada device berada di /data/data/(package-name)/files/myfile.txt. Kita dapat melihat melalui device file explorer di Android Studio untuk lokasi file tersebut. Sedangkan dari device file explorer akses ke path tersebut tidak bisa kecuali device anda sudah di root.

Lokasi file di internal storage

Kode Activity External Storage

Pada metode penyimpanan external, kita perlu tambahkan beberapa kode untuk melakukan cek perijinan dari Android API 23 keatas. Selain mendefinisikan nama file, kita perlu mendefinisikan code request untuk kembalian dari cek perijinan tersebut. Selanjutnya kita siapkan method baru yaitu checkPermission( ) dan onRequestPermissionsResult( ).

Pada method tersebut aplikasi akan menampilkan alert/pop-up ke pengguna apakah pengguna memberikan ijin aplikasi untuk merubah data-data di storage. Jika pengguna menekan tombol allow maka akan dilanjutkan ke proses selanjutnya, jika tidak maka akses ke storage tidak bisa dilakukan oleh aplikasi.

Alert pada device untuk perijinan akses storage

Selain itu, untuk external storage ini perlu menambahkan code permission di AndroidManifest.xml yaitu sebagai berikut:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Pada element <application> di file manifest juga perlu ditambahkan atribut berikut: 

android:requestLegacyExternalStorage="true"

Untuk akses lokasi/path dari file tersebut, disni kita menggunakan method yang berada di class Environment, yaitu: Environment.getExternalStorageDirectory(). Pada method createFile( ) dan editFile( ) juga perlu ditambahkan validasi untuk cek apakah media storage tersebut sudah di mount atau belum dengan kode berikut:

String state = Environment.getExternalStorageState();

if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}

Layout di activity ExStorageActivity menggunakan file yang sama pada activity sebelumnya. Untuk kode lengkap nya seperti dibawah ini:

Anda bisa ujicoba aplikasi tersebut dengan membuat file baru, melihat isi datanya, kemudian cek di device explorer, apakah sudah ada nama file tersebut. Selain itu anda bisa coba edit isi file dan hapus file.

Kesimpulan

Kapan kita perlu menggunakan internal dan external storage? Internal storage paling baik digunakan jika tidak ada yang boleh mengakses file selain aplikasi itu sendiri. Sebaliknya, external storage paling baik digunakan jika file tidak memerlukan batasan akses, file dapat di share ke aplikasi lain atau user diperbolehkan akses file melalui usb atau pc.

Monday, January 4, 2021

Menggunakan SQLite di Android

Alhamdulillah.. awal tahun ini dimulai dengan posting artikel tentang SQLite di Android, semoga bermanfaat untuk rekan-rekan mahasiswa yang sebentar lagi akan menghadapi ujian akhir semester.

Android telah menyediakan salah satu mekanisme penyimpanan database terstruktur dan berelasi dengan menggunakan SQLite. SQLite merupakan database yang bersifat open source yang mendukung operasi relasi standar yang umum terdapat pada engine database seperti sintaks SQL dan operasi transaksi. Meskipun berjalan seperti database, pada umumnya sqlite berukuran kecil dan mampu berjalan pada peranti dengan memori terbatas seperti smartphone.

Pada artikel kali ini kita akan membuat aplikasi Android untuk melakukan CRUD pada tabel student di SQLite dimana terdapat 3 field yaitu, id, nim dan nama.


Kita bisa mulai dengan membuat project baru bernama MyStudents dengan tipe Empty Activity bernama MainActivity dan target minimum API Level bisa kita pilih 21.

Langkah pertama adalah buat package baru dengan nama model, kemudian buat class di Java dengan nama Students.java seperti code berikut:

Pada class Student diatas kita perlu implement ke Serializable supaya nantinya saat proses edit data, object student tersebut dapat dikirimkan melalui intent ke activity UpdateActivity

Selanjutnya buat package baru kembali dengan nama db dan buat class baru dengan nama DbHelper.java, berikut codenya:

Code diatas merupakan Class bantuan untuk pengolahan database DDL(Data Definition Language) dan DML(Data Manipulation Language), dimana untuk proses DDL terdapat pada method onCreate dan onUpgrade, sedangkan proses DML pada method lainnya.

Tahapan selanjutnya adalah kita akan buat proses insert data ke database, disini akan digunakan MainActivity untuk implementasinya. Pertama kita siapkan terlebih dahulu layout di activity_main.xml dengan code dibawah ini:

Kemudian pada MainActivity kita lengkapi code nya seperti dibawah:

Pada code diatas sebelum proses insert ke database kita lakukan terlebih dahulu validasi untuk pengisian EditText nim dan nama, dimana tidak boleh kosong. Selanjutnya, jika validasi terpenuhi maka proses insert akan dilakukan dengan menggunakan object dari class DBHelper pada method addUserDetail( ).

Jika AndroidStudio dan versi Java anda sudah mendukung lambda, maka seperti pada code diatas, penulisan onClickListerner bisa kita sederhanakan dengan lambda. Pada blok code yang berwarna grey/abu-abu bisa anda select kemudian tekan tombol Alt+Enter, maka akan muncul pilahan "Replace with lambda". Sampai proses ini kita sudah bisa melakukan proses input data ke database, silahkan bisa anda ujicoba run aplikasi tersebut

Proses insert data


Proses selanjutnya adalah menampilkan data menggunakan RecyclerView, disini kita perlu membuat class adapter dengan nama StudentAdapter yang bisa kita letakan di package adapter dan juga activity baru dengan nama ListStudentActivity. 

Untuk melengkapi adapter tersebut, kita buat terlebih dahulu layout untuk menampilkan data Student di file item_student.xml dan activity_list_student.xml dengan code berikut:

Berikutnya file StudentAdapter kita lengkapi seperti code dibawah ini:

Pada code diatas masih menampilkan notice error pada baris ke-36 dikarenakan kita belum membuat file UpdateActivity untuk proses edit data. Kita bisa comment terlebih dahulu baris ke-36, 37 dan 38 supaya tidak menyebabkan error, selanjutnya nanti bisa kita uncomment kembali untuk melanjutkan proses edit data.

Berikutnya pada file ListStudentActivity, kita tambahkan code dibawah ini untuk menampilkan data-data yang sudah ada di database ke dalam RecyclerView

Kita bisa melakukan ujicoba dengan menjalankan/run project tersebut, jika sesuai maka aplikasi tersebut akan menampilkan list data student dan bisa kita lakukan penghapusan dengan klik tombol delete pada list di masing-masing student. Sebelum data tersebut dihapus, aplikasi akan memunculkan alertDialog dimana untuk memastikan user benar-benar akan menghapus data tersebut. Proses ini dilakukan pada file AdapterStudent baris ke-41 sampai dengan baris ke-60.

Menampilkan data students


Sedangkan proses edit data belum bisa dilakukan, saat kita tekan tombol edit maka tidak akan terjadi action apapun. Untuk melengkai fitur edit, kita buat activity baru dengan  nama UpdateActivity. Berikut ini code untuk UpdateActivity dan layout nya yaitu activity_update.xml

Setelah code dari kedua file diatas lengkap, kita lakukan uncomment pada file StudentAdapter pada baris ke-36, 37 dan 38. Kemudian bisa kita jalankan aplikasi tersebut dan bisa kita ujicoba untuk melakukan edit pada data student.

Setelah proses edit berhasil maka akan ditampilkan list daftar student, supaya RecyclerView dapat update data terakhir maka perlu ditambahkan override method onResume di activity, seperti pada code di file ListStudentActivity pada baris ke-25 s/d baris ke-31

Silahkan anda coba untuk mempraktikan code diatas secara berurutan ya, dipahami masing-masing keterangan pada code tersebut. Jika ada pertanyaan lebih lanjut lagi bisa tulis di komentar, atau jika membutuhkan code lengkapnya bisa tulis di komentar juga alamat email anda, nanti saya kirim code project secara lengkap.

Video tutorial lengkap bisa disimak disini:



Referensi:

  1. Dicoding Acedemy - Belajar Fundamental Aplikasi Android, Codelab Aplikasi Catatan, https://www.dicoding.com/academies/14/tutorials/527
  2. Android SQLite Tutorial | CRUD Operation Example, https://demonuts.com/android-sqlite/#simple

Monday, October 26, 2020

Tutorial mudah membuat RecyclerView di Android

Sejak google meluncurkan pendekatan material design, penggunaan ListView disarankan untuk beralih ke RecyclerView. Dengan kemampuan yang lebih baik dari pendahulunya, RecyclerView ini lebih fleksible dan mampu menampung jumlah data besar.

Artikel sebelumnya tentang tutorial ListView bisa di cek pada link berikut ini: Tutorial ListView di Android.

Konsep kode program untuk membuat RecyclerView kurang lebih sama pada Custom ListView seperti yang sudah dibahas pada artikel sebelumnya pada link diatas.

Adapun tahapan yang dilakukan dalam membuat RecyclerView yaitu:

  1. Menambah dependency di gradle
  2. Membuat Class model
  3. Membuat layout untuk item list
  4. Membuat Adapter untuk binding data
Berikut detail dari tahapan-tahapan diatas:

Menambah dependency di file gradle

Setelah kita melakukan perubahan pada file gradle maka Android Studio akan meminta anda melakukan sinkronisasi untuk update library yang dibutuhkan.

Selanjutnya pada file xml di layout activity, gunakan juga elemen RecyclerView seperti pada kode dibawah ini:

Membuat Class model

Class model disini kita perlukan untuk mempresentasikan setiap item data menjadi sebuah objek ketika digunakan pada Adapter di RecyclerView. Class model disini akan menggunakan Players yaitu object pemain Juventus FC seperti pada contoh di ListView sebelumnya.

Untuk generate constructor dan method getter setter bisa digunakan shortcut di Android Studio (Win: Alt + Insert, Mac: Cmd + N) untuk mempercepat pembuatannya.

Layout item list

Pada layout ini akan digunakan juga CardView dimana pada item ini akan ditampilkan 3 buah TextView untuk menampung data nama pemain, posisi dan nomer punggung.

Membuat Adapter

Selanjutnya kita perlu buat class Adapter yang merupakan extends/turunan dari RecyclerView.Adapter dengan kode seperti berikut ini:

Dan pada bagian terakhir ini kita akan mengimplementasikannya di Activity dimana data yang akan kita gunakan dalam bentuk String JSON. Kita akan gunakan method setData( ) untuk melakukan parse data JSON ke dalam ArrayList<Players> supaya bisa di-binding oleh Adapter untuk di tampilkan ke layar. 

Setelah tahapan tersebut selesai kita implementasikan, kita dapat menjalankan pada Android Studio dan hasil akhirnya adalah seperti tampilan berikut ini

RecyclerView menggunakan CardView


Jika anda membutuhkan file project lengkap untuk ListView sederhana ataupun RecyclerView seperti pada contoh diatas bisa tuliskan alamat email di komentar, selanjutnya akan saya share kode tersebut untuk anda.

Friday, January 4, 2019

Kembali ke Pebble watch

Pebble adalah smartwatch yang mulai muncul sekitar April 2012 dan support untuk OS Android dan iOS. Pada saat itu, Pebble merupakan satu-satunya smartwatch yang ada, belum ada saingan dari Samsung Gear, Garmin atau iWatch. Pebble Classic adalah smartwatch seri pertama yang diluncurkan oleh Pebble Techology Corporation dan pada bulan Mei 2012 berhasil memperoleh keutungan US$10,3 juta.

Saat itu harga Pebble Classic sekitar $99 dan pada periode promo bisa diorder dengan harga $70-an. Akhir tahun 2013 saya sukses mendapatkan pebble dari searching di Olx dan COD-an di TVRI Jogja dengan harga klo ga salah 800 ribu sekian.

Alasan memiliki Pebble ketika itu adalah: (1)Ga pernah punya jam tangan, (2)Smartwatch yang mendukung notifikasi di Android, (3)Terdapat berbagai macam apps dan watchface yang ada di Pebble Store/Play (Ga tau namanya), (4)Menyediakan Pebble SDK dimana kita dapat mendevelop app atau watcface (Belum kesampaian 😅)

Ternyata seri Pebble Classic ini terdapat kelemahannya, setelah menggunakan sekitar 2 tahun muncul maslaah yaitu layar pada Pebble sering blur/pecah. Setelah mencoba googling, banyak juga yang mengalami masalah ini, istilahnya "pebble screen tearing". Akhirnya saya coba untuk email ke support Pebble dan Alhamdulillah saya akan mendapatkan 1 set Pebble sebagai pengantinya. 💪

Inilah tampilan screen tearing..
Dan sekitar bulan Juli 2015 saya mendapatkan paketnya yang dikirim melalui DHL dan harus menebus sekitar Rp150,000 di Kantorpos. Hmm... seharusnya penerima ga dikenankan biaya lagi, karena ini bukan pembelian barang baru, tapi return dari perusahaan Pebble. Tapi yaa sudahlah.. susah menjelaskan ke pihak yang bersangkutan dan tidak perlu berdebat, banyak-banyak berdoa saja, InshaAllah akan lebih banyak rejeki dari berbagai arah yang tak terduga. 😁😇

Sekitar satu tahun terakhir masalah screen tearing muncul lagi, terakhir kali saya gunakan adalah bulan November 2017 saat trip ke Japan, tapi setelah itu sudah tidak tertolong lagi karena semakin parah. Berhubung perusahaan Pebble sudah  tutup sejak tahun 2016 dan di-informasikan tidak lagi ada supportnya (FYI: Pebble dibeli perusahaan Fitbit dan harga smartwatch-nya mahal-mahal 😑) maka saya pasrahkan saja untuk menyimpan rapat-rapat di kotaknya kembali.

Tetapi 2 hari kemarin koq tiba-tiba di youtube muncul recommended video dengan judul "[GUIDE] Pebble Screen Tearing Fix", penasaran khaan.. dilanjut menyimak dan melihat video-video lainnya. Selanjutnya coba degh buka kembali kotak Pebble dan setelah 1/2 jam bongkar-bongkar berhasil juga fixing Pebble.


Setelah Pebble bisa digunakan kembali rencana meminang Fitbit dibatalkan dulu, karena dari sisi kegunaan smartwatch ini sudah mencukupi. Dan untuk setup kembali ternyata harus install aplikasi rebble sebagai gateway untuk menghubungkan ke aplikasi resmi Pebble. Selanjutnya penggunaan seperti biasa, pilih-pilih watchface, pilih-pilih aplikasi dan nikmati jaman-jaman kejayaan pebble dahulu kala.. ✌😉

Kembali menemani hari-hari yang menyenangkan 😉

Sunday, December 30, 2018

Alasan kenapa update ke Android 9


Setelah dipastikan rilis Android versi 9 atau P dengan codename "Pie" pada tanggal 6 Agustus 2018 kemarin, akhirnya di penghujung tahun 2018 ini kebagian juga update di Mi A1. Seperti pada update-update Android OS sebelumnya, saya tidak begitu tertarik dengan fitur-fitur baru yang ditawarkan. Selama masih oke untuk produktifitas kerjaan dan hoby, fitur-fitur tersebut bagi saya sebagai tambahan saja.

Pada Xiaomi Mi A1, ukuran file update Android P sekitar 1074 MB atau 1GB lebih sedikit. Setelah berhasil update ke Android P, saya coba explore fitur-fitur terbarunya, seperti adaptive battery, adaptive display dan digital wellbeing.

Tetapi pada update Android versi ini, saya tertarik untuk mempelajari aplikasi Digital Wellbeing dari Google. Aplikasi ini dapat meng-identifikasi pengguna ketika melakukan aktivitas di smartphone. Bahkan bisa detail sampai ke setiap aplikasi yang ada. Misal dalam sehari kita menggunakan Whatsapp selama berapa jam, berapa kali membukanya dan berapa jumlah notifikasinya.

Aplikasi Digital Wellbeing
Screen time dan timer limit setiap aplikasi
Bahkan kita bisa mengatur limit dari setiap aplikasi dalam sehari, contohnya Whatsapp bisa kita set sehari maksimal 30 menit, maka setelah lewat dari 30 menit kita tidak dapat membuka aplikasi Whatsapp dan icon menjadi disable. Bagi yang peduli dengan produktivitas aplikasi ini sangat berguna, dengan mempelajari history statistik penggunaan smartphone bisa menjadikan motivasi untuk meningkatkan produktivitas.

Saya sendiri memanfaatkan aplikasi ini untuk mengurangi penggunaan Whatsapp dan meningkatkan penggunaan beHafizh pada beberapa minggu ini, semoga bisa menjadi lebih baik dalam meningkatkan produktifitas dan kebermanfaat banyak orang.

Selamat mencoba untuk mencicipi Pie dari Android 9

Monday, October 8, 2018

Membuat ListView dan CustomListView di Android

Penggunaan komponen ListView sangat sering kita jumpai pada aplikasi Android, seperti pada aplikasi yang menampilkan kontak phonebook, menampilkan data report atau yang lainnya. ListView berguna menampilkan data dalam bentuk vertical/horizontal yang bisa kita scroll keatas dan kebawah.

ListView dapat berjalan menggunakan Adapter yang berfungsi mem-binding data yang akan kita tampilkan. Data-data tersebut bisa dari variabel array, file json yang di dapat dari akses ke API atau data-data dari database local seperti SQLite.

Berikut contoh membuat ListView  sederhana menggunakan ArrayAdapter untuk menampilkan data dari variabel array.

1. ListView Sederhana

Pertama siapkan komponen ListView pada file layout xml yang akan anda gunakan untuk menampilkan data
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    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:padding="8dp"
    tools:context=".MyListActivity">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp" />

</android.support.constraint.ConstraintLayout>

Selanjutnya buatlah variabel ListView dan variabel String array untuk menyiapkan data-data yang akan ditampilkan melalui adapter.
private ListView lvItem;
private String[] players = new String[]{
   "Cristiano Ronaldo", "Paulo Dybala", "Mario Mandžukić",
      "Miralem Pjanić", "Sami Khedira", "Emre Can", "Claudio Marchisio",
      "Medhi Benatia", "Giorgio Chiellini", "Leonardo Bonuci",
      "Wojciech Szczęsny"
};

Dan yang terakhir, pada methode onCreate tambahkan Adapter dan  panggil dari lvItem menggunakan method setAdapter( ), berikut kodenya:
lvItem = (ListView) findViewById(R.id.list_view);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MyListActivity.this,
     android.R.layout.simple_list_item_1, android.R.id.text1, players);

lvItem.setAdapter(adapter);

2. Custom ListView

Custom ListView adalah suatu list dari beberapa item dengan tampilan content yang bisa kita sesuaikan dan mendukung multi-content. Misalkan kita ingin menampilkan data dengan beberapa tipe content, kita bisa menggunakan Custom ListView ini.

Pada tutorial ini kita akan coba menambahkan tampilan data position dan number dari data players yang sudah kita buat pada listView sebelumnya. Anda bisa buat Activity baru lagi dan tambahkan variabel array lagi seperti dibawah ini:

private ListView lvCustom;
private String[] players = new String[]{
    "Cristiano Ronaldo", "Paulo Dybala", "Mario Mandžukić",
    "Miralem Pjanić", "Sami Khedira", "Emre Can", "Claudio Marchisio",
    "Medhi Benatia", "Giorgio Chiellini", "Leonardo Bonuci",
    "Wojciech Szczęsny"
};

private String[] pos = new String[]{
    "Forward", "Forward", "Forward",
    "Midfilder", "Midfilder", "Midfilder", "Midfilder",
    "Defender", "Defender", "Defender",
    "Goal Keeper"
};

private int[] num = {7,10,17,5,6,23,8,4,3,19,1};

Untuk Adapter Custom ini, kita perlu siapkan file xml untuk membuat tampilan view yang kita inginkan. Selain itu kita juga perlu membuat Class di java yang merupakan extends/turunan dari BaseAdapter. Untuk layout xml utama masih sama seperti pada point 1 ListView Sederhana, kita harus menambahkan komponen ListView pada layout tersebut. Berikut contoh kode xml yang anda simpan pada file /res/layout/list_players.xml:

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

    <LinearLayout
        android:id="@+id/ic_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_player"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingBottom="5dp"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:textColor="#000000"
                android:text="Paulo Dybala"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="5dp"
                android:paddingLeft="10dp"
                android:paddingRight="16dp"
                android:text="10"
                android:textAlignment="viewEnd"
                android:textColor="@color/colorPrimaryDark"
                android:textSize="18sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_pos"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="5dp"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:text="Forward"
                android:textColor="@color/colorPrimaryDark" />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

Dan berikut ini adalah kode dari Custom Adapter yang kita siapkan untuk mengatur data dari variabel-variabel array sebeumnya. Kita simpan dengan nama JuveAdapter.java

public class JuveAdapter extends BaseAdapter {

    Context context;
    String[] players;
    String[] positions;
    int[] number;
    LayoutInflater inflater;

    public JuveAdapter(Context context, String[] players, String[] positions,
                       int[] number) {
        this.context = context;
        this.players = players;
        this.positions = positions;
        this.number = number;
        this.inflater = (LayoutInflater.from(context));
    }

    @Override
    public int getCount() {
        return players.length;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view = inflater.inflate(R.layout.list_players, null);
        TextView tvPlayers = (TextView) view.findViewById(R.id.tv_player);
        TextView tvPositions = (TextView) view.findViewById(R.id.tv_pos);
        TextView tvNumbers = (TextView) view.findViewById(R.id.tv_number);

        tvPlayers.setText(players[i]);
        tvPositions.setText(positions[i]);
        tvNumbers.setText(number[i]+"");

        return view;
    }
}

Dan terakhir kita perlu menambahkan kode berikut di method onCreate untuk men-set Custom Adapter yang telah kita buat pada slistview.

lvCustom = findViewById(R.id.list_view);
JuveAdapter adapter = new JuveAdapter(this, players, pos, num);
lvCustom.setAdapter(adapter);

Tampilan ListView dan Custom ListView sebagai berikut:

 

Jika ada pertanyaan dari kode tutorial kode diatas, silahkan tinggal pesan pada kolom komentar, Semoga bermanfaat

Monday, August 20, 2018

Membuat Splash Screen di Android

Pada beberapa aplikasi Android, terdapat splash screen yang akan tampil saat aplikasi pertama di jalankan. Fungsi dari splash screen tersebut bermacam-macam, ada yang digunakan untuk load data, untuk menjalankan file konfigurasi, atau untuk proses suatu algoritma tertentu.

Ada juga splash screen yang tidak ada fungsinya sama sekali, khusus digunakan untuk tampilan awal saja. Pada artikel ini akan saya bahas pembuatan splash screen yang digunakan untuk tampilan saja, tidak ada fungsi khusus di dalamnya. 

Setelah membuat project baru dari AndroidStudio, buat activity baru dengan nama SplashActivity. jadikan activity tersebut sebagai launcher dan tambahkan code untuk file manifests/AndroidManifest.xml sebagai berikut:
<activity android:name=".MainActivity"></activity>
<activity android:configchanges="orientation|keyboardHidden|screenSize" 
    android:name=".SplashActivity" 
    android:theme="@style/AppTheme.Fullscreen">
     <intent-filter>
          <action android:name="android.intent.action.MAIN">
          <category android:name="android.intent.category.LAUNCHER">
     </category></action></intent-filter>
</activity>
Pada code diatas masih muncul error di editor, karena tema yang digunakan SplashActivity tidak ditemukan, selanjutnya tambahkan code berikut di file /res/values/styles.xml:
<style name="AppTheme.Fullscreen">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
</style>
Untuk tampilan layout-nya, kita bisa sesuaikan file /res/layout/activity_splash.xml dengan code dibawah ini:
<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/colorPrimaryDark"
    android:orientation="vertical"
    tools:context=".SplashActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="200dp"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content"
        android:contentDescription="Logo"
        app:srcCompat="@drawable/logo_movie" />
</RelativeLayout>


Dalam pembuatan logo contoh aplikasi ini saya gunakan web online https://logomakr.com/, dimana kita tinggal sesuaikan saja dengan icon dan font yang bisa kita butuhkan dan edit secara online. File logo dalam format png silahkan di-copy pada folder /res/drawable dan di panggil sesuai namanya seperti pada code diatas.

Terakhir, pada file SplashActivity tambahkan code berikut pada fungsi onCreate( ). Code tersebut berfungsi mengarahkan ke MainActivity setelah delay waktu 2 detik.
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Intent intent = new Intent(SplashActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}, 2000);
Dan tampilan akhirnya kurang lebih seperti pada gambar dibawah ini:


Silahkan untuk dicoba code diatas untuk membuat splash screen di Android, jika ada yang ingin ditanyakan bisa tinggalkan di kolom pesan yaa

Sunday, August 19, 2018

Bagaimana menyimpan API KEY di Android?

Sebelumnya saya selalu menyimpan API Key dalam suatu class di android pada field tertentu. Ternyata hal ini sangat tidak dianjurkan dalam best practice pengembangan aplikasi Android. Kenapa? 

Karena saat kita menaruh code program kita di suatu repository, misal Github, maka orang lain akan bisa mengakses API Key milik kita, dimana jika ada orang yang menyalahgunakan akan berakibat kerugian dari kita sendiri.

Berikut ini caranya supaya API Key kita tetap aman meskipun code kita dishare melalui repository:
  1. Setelah membuat project dan diintegrasikan dengan version control, misalnya git. Tambahkan file /gradle.properties pada gitignore dari project tersebut. Seperti pada baris ke-11 file .gitignore dibawah ini:
    *.iml
    .gradle
    /local.properties
    /.idea/libraries
    /.idea/modules.xml
    /.idea/workspace.xml
    .DS_Store
    /build
    /captures
    .externalNativeBuild
    /gradle.properties
    
  2. Tambahkan baris kode API berikut pada file project:gradle.properties. Pada contoh berikut saya gunakan 2 API Key dari TheMovieDB dan OpenWeather:
    #API KEY
    TheMovieDBApi = 4b5017168cac6677269cxxxxxx
    TheOpenWeatherApi = 4de4dd041e499ca8axxxxxx
    
  3. Selanjutnya buka file app: build.gradle, tambahkan code seperti pada baris ke-3 sampai dengan baris ke-6 dan code pada baris ke-17 sampai dengan baris ke-20 seperti dibawah ini:
    apply plugin: 'com.android.application'
    
    // Define Variable API Key
    def STRING = 'String'
    def THEMOVIEDB_API_KEY = '"' + TheMovieDBApi + '"' ?: '"Define your The Movie DB API Key!"'
    def OPENWEATHER_API_KEY = '"' + TheOpenWeatherApi + '"' ?: '"Define your The Openweather API Key!"'
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "net.ariflaksito.katalogfilm"
            minSdkVersion 15
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            each { type ->
                type.buildConfigField STRING, 'TheMovieDBApi', THEMOVIEDB_API_KEY
                type.buildConfigField STRING, 'TheOpenWeatherApi', OPENWEATHER_API_KEY
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:28.+'
        implementation 'com.android.support.constraint:constraint-layout:1.0.2'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.1'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }
    
  4. Setelah itu anda bisa memanggil API Key tersebut melalui class di Android.
    static String MOVIE_API = BuildConfig.TheMovieDBApi;
    static String WEATHER_API = BuildConfig.TheMovieDBApi;
Alhamdulillah mendapatkan ilmu ini dari masukan reviewer di submission pertama pada project kelas MADE di dicoding, yang belum tau dicoding bisa menuju ke artikel saya yang ini.

Semoga bermanfaat yaa.. 

Thursday, August 16, 2018

Belajar Android dengan Dicoding


Sekitar 2 bulan yang lalu, salah satu rekan dosen mengajak saya untuk mengikuti beasiswa Google dengan kurikulum dari dicoding. Apa itu dicoding? Silahkan pelajari informasi detailnya di https://www.dicoding.com.

Awalnya saya pikir ini seperti online course lainnya yang membosankan dan tidak sesuai dengan kebutuhan industri, lebih enak belajar langsung dari stackoverflow.com degh 😅😁

Ternyata kurikulum di dicoding berbedaa, selain materi yang terstruktur seperti pada dokumentasi resmi di Android Developer dengan cita rasa bahasa indonesia, terdapat juga penjelasan dalam bentuk video oleh pakar-pakar yang berkompeten dan yang paling menarik adalah adanya code review dari setiap submission yang kita kerjakan.

Menurut saya yang paling menarik dan kereen adalah adanya fitur code review di dicoding. Disini kita bisa belajar banyak dari masukan-masukan yang diberikan oleh reviewer untuk code yang kita submit. Selanjutnya kita tinggal ikuti masukan-masukan tersebut untuk submission yang kita kerjakan atau untuk submission selanjutnya. Setelah menyelesaikan kelas Menjadi Android Developer Expert (MADE), banyak sekali pengalaman yang saya dapatkan dalam mengembangkan aplikasi Android kedepannya, dan pastinya sangat bermanfaat untuk teman-teman yang sedang belajar atau yang sudah berkecimpung di industri pengembangan aplikasi Android.

Oiyaa.. bagi mahasiswa aktif atau dosen bisa mendapatkan beasiswa dari Google untuk kelas MADE di dicoding, untuk dosen bisa dipelajari pada tautan berikut ini: https://goo.gl/AhXoWD. Sedangkan untuk mahasiswa bisa menuju ke tautan ini: https://goo.gl/YAt6ea

Bagi mahasiswa dibutuhkan referral dari dosen, silahkan bisa menggunakan link berikut ini:
  1. Belajar Membuat Aplikasi Android untuk Pemula, https://www.dicoding.com/s/G8Mw1nwQ
  2. Menjadi Android Developer Expert (MADE), https://www.dicoding.com/s/vwAvBXvW
Menurut saya, bagi yang benar-benar serius ingin belajar membuat aplikasi Android, beasiswa ini perlu diperjuangkan. Silahkan bisa di cek di tokopedia atau bukalapak untuk harga resmi course ini adalah 2,2 juta rupiah
Saat anda berhasil menyelesaikan suatu course di dicoding, anda akan mendapatkan sertifikat dimana bermanfaat khususnya bagi yang akan apply ke industri-industri aplikasi digital.

Pada artikel berikutnya akan saya bahas tentang salah satu submission di kelas MADE Dicoding.

Semoga bermanfaat.