Contoh Sederhana Recyclerview CardView, Dengan Implementasi Retrofit

Cara Membuat Aplikasi Android

Contoh Sederhana Recyclerview Retrofit – Untuk tutorial android kali ini, kita akan mencoba mengimplementasikan contoh sederhana menampilkan data dengan recyclerview dan menggunakan retrofit sebagai REST client HTTP. Setelah sebelumnya kita telah berhasil membuat fungsi untuk login dan logout user (https://soft-gain.com/2020/06/19/cara-membuat-aplikasi-android-rest-api-menggunakan-retrofit/), sekarang kita akan coba menampilkan data pada Recyclerview dengan memanfaatkan retrofit sebagai REST client HTTP. Tanpa berlama-lama lagi langsung saja kita masuk pada pembahasan Contoh Sederhana Recyclerview CardView.

Recyclerview sendiri sebenarnya adalah sebuah dependencies yang digunakan untuk menampilkan data dalam bentuk list, biasanya dikombinasikan dengan cardview sebagai pembungkus atau frame layout masing-masing data. Dikarenakan kita akan menggunakan dua
dependencies ini, silahkan tambahkan dua library ini pada file build.gradle :

implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'

Berikutnya kita akan membuat model, untuk pembuatan model saya menggunakan website ini (http://www.jsonschema2pojo.org/) yang membantu saya memudahkan untuk men-convert hasil json string saya ke dalam java class, caranya sangat mudah tinggal paste-kan saja string json kita kedalam text area sebelah kiri lalu tekan preview, kurang lebih seperti ini :

Contoh Sederhana Recyclerview CardView
Masukan json string
Contoh Sederhana Recyclerview CardView
Hasil dalam bentuk class

Kita tinggal copy paste saja hasil preview diatas ke dalam class java kita, atau bisa jika klik tombol zip untuk download java class kita dalam dalam bentuk file.

Berikutnya buatlah 4 buah model seperti gambar dibawah ini (yang mana hasil java class dari website jsonschema2pojo akan kita taruh dalam model ini) :

Contoh Sederhana Recyclerview CardView
Model Barang

Pertama didalam model barang kita memiliki fungsi getSuccess yang yang akan kita gunakan untuk mengambil object success dari json response yang kita terima :

package com.soft_gain.myinventory.Model.Barang;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Barang {
    @SerializedName("success")
    @Expose
    private Success success;

    public Success getSuccess() {
        return success;
    }

    public void setSuccess(Success success) {
        this.success = success;
    }
}

Lalu didalam model success, kita memiliki fungsi getData yang kita gunakan untuk mengambil object data dalam bentuk list :

package com.soft_gain.myinventory.Model.Barang;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Success {
    @SerializedName("data")
    @Expose
    private List<Datum> data = null;

    public List<Datum> getData() {
        return data;
    }

    public void setData(List<Datum> data) {
        this.data = data;
    }
}

Lalu didalam model datum atau model data, kita men-serialisasi-kan satu persatu attribute kedalam object java :

package com.soft_gain.myinventory.Model.Barang;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Datum {
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("nama_barang")
    @Expose
    private String namaBarang;
    @SerializedName("jumlah_barang")
    @Expose
    private Integer jumlahBarang;
    @SerializedName("keterangan")
    @Expose
    private Object keterangan;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    @SerializedName("updated_by")
    @Expose
    private Integer updatedBy;
    @SerializedName("get_updated_by")
    @Expose
    private GetUpdatedBy getUpdatedBy;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNamaBarang() {
        return namaBarang;
    }

    public void setNamaBarang(String namaBarang) {
        this.namaBarang = namaBarang;
    }

    public Integer getJumlahBarang() {
        return jumlahBarang;
    }

    public void setJumlahBarang(Integer jumlahBarang) {
        this.jumlahBarang = jumlahBarang;
    }

    public Object getKeterangan() {
        return keterangan;
    }

    public void setKeterangan(Object keterangan) {
        this.keterangan = keterangan;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

    public String getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(String updatedAt) {
        this.updatedAt = updatedAt;
    }

    public Integer getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(Integer updatedBy) {
        this.updatedBy = updatedBy;
    }

    public GetUpdatedBy getGetUpdatedBy() {
        return getUpdatedBy;
    }

    public void setGetUpdatedBy(GetUpdatedBy getUpdatedBy) {
        this.getUpdatedBy = getUpdatedBy;
    }
}

Untuk model getUpdatedBy sementara ini tidak dipakai jadi kita skip saja. Berikutnya buka file Interface.java dan tambahkan code berikut ini sebagai end point api kita :

@POST("barang")
Call<Barang> postBarang(@Header("Authorization") String Authorization);

Perlu diperhatikan diatas, dimana kita memanggil model barang.java pada end point postBarang (dibagian ini : Call<Barang>), end point postBarang ini lah yang akan kita panggil pada bagian antar muka nantinya. Berikutnya kita akan menambahkan file BarangAdapter yang akan kita gunakan untuk data binding dengan RecyclerView :

package com.soft_gain.myinventory.Barang;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.soft_gain.myinventory.Barang.BarangFragmentList;
import com.soft_gain.myinventory.Model.Barang.Datum;
import com.soft_gain.myinventory.R;

import java.util.List;

public class BarangAdapter extends RecyclerView.Adapter<BarangAdapter.CustomViewHolder>{
    private List<Datum> dataList;
    private Context context;

    public BarangAdapter(List<Datum> dataList){
        this.dataList = dataList;
    }

    public BarangAdapter(BarangFragmentList connectFragment, List<Datum> dataList) {}

    class CustomViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        TextView txtTitle;

        CustomViewHolder(View itemView) {
            super(itemView);
            mView = itemView;

            txtTitle = mView.findViewById(R.id.title);
        }
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.adapter, parent, false);
        return new CustomViewHolder(view);
    }

    @Override
    public void onBindViewHolder(CustomViewHolder holder, int position) {
        holder.txtTitle.setText(dataList.get(position).getNamaBarang());
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
}

Perlu diperhatikan pada BarangAdapter diatas, dimana kita memanggil model Datum atau model data sebagai list yang mana model inilah yang akan kita inisiasi-kan kedalam recyclerview nantinya. Lalu berikutnya kita akan membuat fragment sebagai implementasi antar muka yang akan kita gunakan untuk menampilkan list data pada user. Tambahkan file BarangFragmentList.java dan isinya kurang lebih seperti ini :

package com.soft_gain.myinventory.Barang;

import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.soft_gain.myinventory.Api.Client;
import com.soft_gain.myinventory.Api.Interface;
import com.soft_gain.myinventory.Barang.BarangAdapter;
import com.soft_gain.myinventory.Model.Barang.Barang;
import com.soft_gain.myinventory.R;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class BarangFragmentList extends Fragment {
    ProgressDialog progressDoalog;
    SharedPreferences myPrefs;

    public BarangFragmentList() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_barang_list, container, false);
        RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        progressDoalog = new ProgressDialog(getActivity());
        progressDoalog.setMessage("Loading....");
        progressDoalog.show();

        myPrefs = getActivity().getSharedPreferences("sg_shared_pref", getActivity().MODE_PRIVATE);
        String token = myPrefs.getString("token", "");

        Interface service = Client.getClient().create(Interface.class);
        Call<Barang> call = service.postBarang("Bearer "+token);
        call.enqueue(new Callback<Barang>() {
            @Override
            public void onResponse(Call<Barang> call, Response<Barang> response) {
                /*Log.v("log softgain : ", String.valueOf(response.body().getSuccess().getData().get(0).getNamaBarang()));*/
                progressDoalog.dismiss();
                RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
                recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                BarangAdapter mAdapter = new BarangAdapter(response.body().getSuccess().getData());
                recyclerView.setAdapter(mAdapter);
                recyclerView.setItemAnimator(new DefaultItemAnimator());
            }

            @Override
            public void onFailure(Call<Barang> call, Throwable t) {
                /*Log.v("log softgain : ", String.valueOf(t));*/
                progressDoalog.dismiss();
                Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
            }
        });

        return rootView;
    }
}

Perhatikan pada fragment diatas, dimana kita memanggil end point postBarang yang sudah kita buat sebelumnya, perlu diperhatikan juga dimana model yang kita jadikan acuan untuk inisiasi data adalah model barang (model ini harus disesuaikan dengan model yang kita deklarasikan pada end point di interface). Barulah pada bagian onResponse, kita men-inisiasi-kan getData (pada bagian ini : BarangAdapter mAdapter = new BarangAdapter(response.body().getSuccess().getData())) kedalam barangAdapter (yang mana sudah kita sesuaikan dalam BarangAdapter.java yang juga didalamnya kita inisiasi-kan model Datum atau model data), sehingga attribute yang ada dalam model datum atau model data dapat kita inisiasi-kan kedalam recyclerview. Lalu berikutnya tambahkan class BarangFragmentList pada MainActivity.java dibagian method selectItem (disini kita menggunakan side navigation menu yang akan kita bahas pada artikel berbeda). Berikutnya tambahkan layout fragment_barang_list.xml, di file ini kita akan menggunakan RecyclerView :

<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:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"  />

</RelativeLayout>

Terakhir kita akan tambahkan layout adapter.xml, yang mana pada file inilah kita akan menggunakan CardView :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view_friend"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardUseCompatPadding="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/title"
            style="@style/TextAppearance.AppCompat.Medium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:paddingTop="20dp"
            android:lines="2"
            android:text="title" />

    </RelativeLayout>

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

Berikut ini adalah contoh hasil dari apa yang sudah kita buat diatas :

Contoh Sederhana Recyclerview CardView
Contoh Recyclerview CardView

Demikian contoh sederhana dari implementasi recyclerview dan cardview menggunakan retrofit sebagai REST client HTTP, untuk full source-nya bisa diambil di repo saya (https://github.com/ImmanuelJL/myinventory.git), terima kasih.

Cara Membuat Aplikasi Android, REST API menggunakan Retrofit

Cara Membuat Aplikasi Android

Cara Membuat Aplikasi Android – Melanjutkan artikel sebelumnya dimana kita sudah membuat web service atau api menggunakan framework laravel (https://soft-gain.com/2020/06/13/tutorial-laravel-membuat-aplikasi-web-service/), maka kali ini kita akan mencoba membahas cara membuat aplikasi berbasis android dengan maksud meng-implementasikan web service yang sudah dibuat sebelumnya. Sebelum masuk pada pembahasan, jika ingin membaca mengenai dasar pembuatan aplikasi berbasis android bisa di temukan pada artikel ini (https://soft-gain.com/2020/06/15/cara-membuat-aplikasi-android-hello-world-android-studio/).

Tujuan – Mampu Membuat Aplikasi Android Yang Terintegrasi Dengan Web Service

Artikel ini dibuat dengan harapan kita mampu membuat aplikasi berbasis android dan meng-integrasi-kan nya dengan sebuah web service, pembahasan pada tutorial ini akan dibagi menjadi beberapa artikel yang meliputi dasar-dasar dari pemrograman aplikasi android yang bersifat umum seperti membuat list data, membuat form berserta dengan metode olah datanya (CRUD), pengetahuan dasar tentang activity, fragment, manifest, gradle dan lain-lain.

Materi Pembahasan

Untuk membuat aplikasi kita dapat menggunakan web service yang sudah dibuat sebelumnya, kita perlu meng-install library bernama retrofit (https://square.github.io/retrofit/), retrofit sendiri adalah sebuah REST client HTTP untuk java atau android yang digunakan untuk membuat HTTP request dan memproses HTTP response dari web service sehingga dapat di gunakan pada aplikasi berbasis android. Untuk meng-install library ini pada aplikasi kita, buka file build.gradle dan tambahkan code di bawah ini pada bagian dependencies :

implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'

Setelah ditambahkan jangan lupa untuk menekan tombol sync now dan pastikan anda terhubung dengan internet.

Selain retrofit, kita juga meng-install gson, gson sendiri adalah library buatan Google yang di gunakan untuk meng-konvert json menjadi java object atau pun sebaliknya.

Selanjutnya kita akan menambahkan package baru dengan nama Api, di dalamnya kita akan membuat dua file, client.java dan interface.java. Kurang lebih seperti ini tampilan dari struktur direktori nya :

Cara Membuat Aplikasi Android

Class client.java berisi koneksi antara client dengan server, di dalam file ini juga kita akan mendeklarasikan end point api kita, kita akan men-deklarasikannya dalam atribut BASE_URL, silahkan diganti dan di sesuaikan dengan end point api masing-masing (dalam case saya end point yang saya pakai adalah http://192.168.43.12:8080/belajar-laravel/public/api/, dimana 192.168.43.12 adalah ip local pc saya), isi dari client.java seperti ini :

package com.soft_gain.myinventory.Api;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Client {
    public static final String BASE_URL = "http://end-point-api-anda/";
    private static Retrofit retrofit = null;
    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

Class interface.java sendiri berisi metode yang akan di gunakan untuk melakukan pertukaran data antara client dan server, isi dari interface.java kurang lebih seperti ini :

package com.soft_gain.myinventory.Api;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.POST;
import retrofit2.http.PUT;

import com.soft_gain.myinventory.Model.Auth.Login;

public interface Interface {
    @FormUrlEncoded
    @POST("login")
    Call<Login> postLogin(@Field("email") String email,
                           @Field("password") String password);
}

Berikutnya kita akan membuat model, pertama buatlah package baru dengan nama Model, lalu buat lagi package baru di dalam Model dengan nama Auth, lalu di dalam package Auth tambahkan dua file Login.java dan Token.java, kurang lebih seperti ini strukturnya :

Cara Membuat Aplikasi Android

Isi dari Login.java seperti ini :

package com.soft_gain.myinventory.Model.Auth;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Login {
    @SerializedName("success")
    @Expose
    private Token success;

    public Token getSuccess() {
        return success;
    }
}

Dan Token.java seperti ini :

package com.soft_gain.myinventory.Model.Auth;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Token {
    @SerializedName("token")
    @Expose
    private String token;

    public String getToken() {
        return token;
    }
}

Berikutnya kita akan menambahkan LoginActivity.java, class ini berfungsi untuk menghandle otentikasi user yang akan kita implementasikan pada aplikasi kita, isinya kurang lebih seperti ini :

package com.soft_gain.myinventory;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.soft_gain.myinventory.Model.Auth.Login;
import com.soft_gain.myinventory.Api.Client;
import com.soft_gain.myinventory.Api.Interface;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginActivity extends Activity {
    Button b1,b2;
    EditText ed1,ed2;
    Interface mApiInterface;

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

        b1 = (Button)findViewById(R.id.button);
        b2 = (Button)findViewById(R.id.button2);
        ed1 = (EditText)findViewById(R.id.editText);
        ed2 = (EditText)findViewById(R.id.editText2);

        mApiInterface = Client.getClient().create(Interface.class);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<Login> postLoginExe = mApiInterface.postLogin(ed1.getText().toString(), ed2.getText().toString());
                postLoginExe.enqueue(new Callback<Login>() {
                    @Override
                    public void onResponse(Call<Login> call, Response<Login> response) {
                        if(response.isSuccessful()){
                            /*Log.v("log softgain : ", String.valueOf(response.body().getSuccess().getToken()));*/
                            Toast.makeText(getApplicationContext(),
                                    "Login berhasil",Toast.LENGTH_SHORT).show();

                            SharedPreferences sgSharedPref = getApplicationContext().getSharedPreferences("sg_shared_pref", getApplicationContext().MODE_PRIVATE);
                            SharedPreferences.Editor editor = sgSharedPref.edit();
                            String token = String.valueOf(response.body().getSuccess().getToken());
                            editor.putString("token", token);
                            editor.apply();

                            startActivity(new Intent(LoginActivity.this, MainActivity.class));
                        }else{
                            Toast.makeText(getApplicationContext() ,"Login gagal",Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<Login> call, Throwable t) {
                        /*Log.v("log softgain : ", String.valueOf(t));*/
                        Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                    }
                });
            }
        });

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

Perhatikan di atas, kita menambahkan sebuah on click event pada button login atau yang saya deklarasikan sebagai b1, yang mana didalamnya kita memanggil api interface yang sudah kita buat sebelumnya. Kita akan mencoba meng-handle response yang kita terima melalui method onResponse, di dalam onResponse kita memiliki if statement response.isSuccessful() yang kita gunakan untuk do event berikutnya bila proses otentikasi user berhasil. Perlu di perhatikan jika proses otentikasi user berhasil maka kita akan menyimpan token yang kita peroleh dari response server ke dalam shared preferences, penyimpanan informasi token ke shared preferences ada pada bagian ini :

SharedPreferences sgSharedPref = getApplicationContext().getSharedPreferences("sg_shared_pref", getApplicationContext().MODE_PRIVATE);
                            SharedPreferences.Editor editor = sgSharedPref.edit();
                            String token = String.valueOf(response.body().getSuccess().getToken());
                            editor.putString("token", token);
                            editor.apply();

Untuk detail mengenai shared preferences akan di bahas pada artikel yang berbeda.

Lalu kita juga akan membuka activity baru yaitu MainActivity, proses untuk membuka activity baru ada pada bagian ini :

startActivity(new Intent(LoginActivity.this, MainActivity.class));

Berikutnya kita tambahkan layout baru yaitu activity_login.xml, ini adalah tampilan yang akan di lihat oleh user sebagai halaman login, isi nya kurang lebih seperti 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" tools:context = ".LoginActivity">

<TextView android:text = "Login" android:layout_width="wrap_content"
android:layout_height = "wrap_content"
android:id = "@+id/textview"
android:textSize = "35dp"
android:layout_alignParentTop = "true"
android:layout_centerHorizontal = "true" />

<TextView android:text = "@string/app_name" android:layout_width="wrap_content"
android:layout_height = "wrap_content"
android:id = "@+id/textview2"
android:textSize = "35dp"
android:layout_below="@+id/textview"
android:layout_centerHorizontal = "true" />

<EditText
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:id = "@+id/editText"
android:hint = "Email"
android:focusable = "true"
android:textColorHighlight = "#ff7eff15"
android:textColorHint = "#ff2937"
android:layout_alignParentLeft = "true"
android:layout_alignParentStart = "true"
android:layout_alignParentRight = "true"
android:layout_alignParentEnd = "true"
android:layout_centerInParent="true" />

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText"
android:textColorHint="#ff2937"
android:hint="Password" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="login"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/textview"
android:layout_toStartOf="@+id/textview"
style="@style/Widget.AppCompat.Button.Colored"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel"
android:id="@+id/button2"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/textview"
android:layout_toEndOf="@+id/textview"
style="@style/Widget.AppCompat.Button.Colored"/>

</RelativeLayout>

Selanjutnya kita juga akan melakukan sedikit modifikasi pada MainActivity.java, kurang lebih jadi seperti ini :

package com.soft_gain.myinventory;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences sharedPrefs = getSharedPreferences("sg_shared_pref", MODE_PRIVATE);
SharedPreferences.Editor ed;
if(!sharedPrefs.contains("token")){
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@SuppressLint("ResourceType")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.layout.top_menu, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_logout) {
logout();
return true;
}
return super.onOptionsItemSelected(item);
}

private void logout() {
SharedPreferences sgSharedPref = getApplicationContext().getSharedPreferences("sg_shared_pref", getApplicationContext().MODE_PRIVATE);
sgSharedPref.edit().clear().commit();

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

Perhatikan di atas, dimana kita menambahkan method baru yaitu logout, yang berisikan penghapusan shared preferences berisi informasi token dan pemindahan user kembali ke activity LoginActivity, on click event dari method logout ini sendiri kita trigger melalui interface pada top menu yang di presentasikan melalui top_menu.xml (detail pembuatannya akan dibahas pada artikel yang berbeda). Pada bagian onCreate juga kita menambahkan if statement (pengecekan token pada shared preferences) untuk memastikan hanya user yang memiliki token saja yang bisa mengakses MainActivity.

Penutup

Demikian lah pembahasan kali ini, untuk full source nya bisa di ambil di repo saya (https://github.com/ImmanuelJL/myinventory.git), terima kasih.

Update :

Part 2 : https://soft-gain.com/2020/06/23/contoh-sederhana-recyclerview-cardview-dengan-implementasi-retrofit/

Part 3 : https://soft-gain.com/2020/06/28/aplikasi-crud-android-database-mysql-menggunakan-retrofit-dan-laravel/

Cara Membuat Aplikasi Android, Hello World Android Studio

Cara Membuat Aplikasi Android

Pada kesempatan kali ini saya hendak mencoba membagikan pengalaman saya membuat aplikasi android hello world menggunakan android studio, android studio bisa di download secara gratis di sini (https://developer.android.com/studio). Sebenarnya untuk membuat aplikasi berbasis android tidak lah harus menggunakan android studio, hanya saja android studio di rekomendasikan karena mendapat support penuh dari Google selaku pengembang dari OS berbasis android. Seperti awal dari semua pembuatan aplikasi, kita akan memulainya dengan membuat aplikasi hello world. Tanpa perlu berbasa-basi lagi langsung saja kita masuk pada pembahasan, pembuatan aplikasi android hello world menggunakan android studio.

Kita buka android studio nya, lalu pilih sesuai gambar di bawah ini untuk membuat project baru :

Hello World Android Studio

Di halaman berikutnya, kita di minta untuk mengisikan nama aplikasi, domain company dan dimana aplikasi project ingin kita tempatkan. Seperti gambar di bawah ini :

Hello World Android Studio

Selanjutnya kita akan memilih pada perangkat apa dan minimum versi OS berapa aplikasi yang hendak kita buat bisa berjalan. Seperti gambar ini :

Hello World Android Studio

Lalu berikutnya kita akan di tampilkan beberapa activity default yang bisa kita jadikan dasar pengembangan aplikasi kita, untuk saat ini kita pilih saja empty activity, seperti gambar di bawah ini :

Cara Membuat Aplikasi Android

Berikutnya kita akan di minta mengisikan nama pada activity dan layout utama pada aplikasi kita, seperti gambar di bawah ini :

Cara Membuat Aplikasi Android

Lalu tinggal klik finish, jika sudah selesai seperti ini lah tampilan dari source project yang baru kita buat :

Cara Membuat Aplikasi Android

Jika kita lihat gambar di atas, di sebelah kiri kita memiliki struktur folder yang akan kita gunakan jika mengembangkan aplikasi menggunakan android studio. Pertama kita memiliki folder manifest, di dalamnya terdapat file AndroidManifest.xml, file ini berisi komponen dasar dari aplikasi kita, seperti activity, services dan user permission, jangan lupa juga jika kita hendak menambahkan activity baru untuk di deklarasikan di dalam file ini.

Berikutnya ada folder java, di dalamnya berisi file-file ber-ekstensikan .java, folder ini berisi class-class yang di tulis dengan bahasa pemrograman java, biasanya file ini berisi activity, fragment, model, class helper kita dalam membuat aplikasi dan lain-lain, intinya di folder inilah kita akan menaruh semua source code kita nantinya.

Berikutnya ada folder res, folder res sendiri di bagi lagi menjadi 4 bagian yaitu drawable, layout, mipmap, dan values. Folder drawable sendiri berisikan asset berupa gambar yang hendak kita gunakan pada aplikasi, folder layout merupakan tempat di mana kita manruh source untuk membuat interface atau tampilan yang akan di lihat oleh user, folder mipmap biasanya di gunakan untuk menyimpan file atau icon launcher pada aplikasi, folder values berisikan file-file untuk menampung interface value yang bisa kita gunakan secara global pada aplikasi.

Terakhir ada gradle, yang berisikan informasi versi OS, SDK dan library apa saja yang kita gunakan dalam aplikasi, file ini jugalah yang menjadi build tool untuk menjalankan aplikasi kita pada andriod studio.

Terakhir kita akan coba jalankan aplikasi, untuk menjalankan aplikasi ada dua pilihan yaitu menggunakan emulator atau menggunakan perangkat asli, saya sendiri belum pernah menggunakan emulator karena membutuhkan ram dalam jumlah yang cukup besar, dan juga dengan pertimbangan testing aplikasi pada perangkat asli memiliki tingkat keakuratan QC yang lebih baik.

Saya sendiri menggunakan hp xiaomi redmi 3s untuk proses debug dan test aplikasi, pada hp xiaomi silahkan masuk ke setting -> about phone lalu ketuk miui version sampai keluar pop up “you are now a developer”. Berikutnya buka setting -> additional setting -> developer options enable kan usb debugging pada pengaturan ini. Selanjutnya sambung kan hp dengan PC menggunakan kabel usb, lalu klik run pada andriod studio, maka akan di munculkan beberapa pilihan debugging tools yang ter-install pada pc kita :

Cara Membuat Aplikasi Android

Jika sudah tampil maka tinggal klik ok saja dan tunggu proses installasi pada hp, perlu menjadi catatan mungkin terdapat perbedaan cara menghubungkan perangkat hp dengan andriod studio untuk dapat terbaca sebagai debugging tools. Demikianlah pembahasan pada kali ini, terima kasih.