AGENDA
Tutorials - Android
Proyek AplydroidPersa

Membahas widget, navigasi, koneksi php dan mysql, spinner dan tabel dengan data dinamis, dan struktur proyek.



Pada aplikasi ini Anda akan mempelajari:

  1. Cara kerja berbagai widget: TextView, Button, EditText, Spinner, Table
  2. Cara kerja navigasi halaman menggunakan intent
  3. Koneksi ke server dengan php, dan akses data pada MySQL
  4. Menampilkan data dinamis pada spinner
  5. Menampilkan data dinamis pada table
  6. Mengimplementasikan proyek dengan struktur yang baik

Kebutuhan Aplikasi

Tahap yang penting dalam pembuatan aplikasi adalah “memahami proses bisnis”
Berikut diberikan proses bisnis singkat:
Aplikasi ini dinamakan “Personal Study Assistant” atau yang disingkat dengan PERSA.Aplikasi ini ditujukan bagi mahasiswa untuk mendukung aktivitas belajar selama mengikuti perkuliahan secara paperless. Dimana mahasiswa dapat mencatat mata kuliah, penjadwalan mata kuliah dan pencatatan tugas atau ujian. Nantinya seluruh data disimpan di web server, sehingga pengguna dapat mengaksesnya lewat internet maupun lewat smartphone. Dengan adanya aplikasi ini, mahasiswa dapat mengakses bahan kuliah atau jadwal di mana saja dengan akses ke internet. Fitur yang dimiliki oleh aplikasi adalah sebagai berikut:

  1. Login, registrasi, password recovery
  2. Manajemen matakuliah – untuk mengelola semua mata kuliah yang diajarkan, termasuk nama dosen, jumlah sks dan buku-buku yang dibutuhkan
  3. Manajemen ujian dan tugas – untuk mencatat bila ada ujian atau tugas yang diberikan dan mendapatkan reminder alarm sebagai pengingat
  4. Manajemen nilai – untuk mencatat nilai yang dimiliki untuk setiap mata kuliah
  5. Manajemen catatan kuliah – untuk mencatat bahan kuliah yang diajarkan oleh dosen
  6. Manajemen jadwal kuliah – untuk mencatat jadwal kuliah termasuk bila ada perubahan jam kuliah dan juga dilengkapi dengan reminder alarm sebagai pengingat.

Aplikasi ini dibuat sangat sederhana, dan ditujukan untuk memberi pemahaman yang singkat dan jelas kepada para pembaca.

Rancangan Antar Muka

Sebelum seorang programmer membuat produk perangkat lunak, maka terlebih dahulu programmer tersebut memahami apa yang akan dikerjakan, dengan cara membuat model rancangan (design model). Model ini dapat dipandang sebagai sebuah cetakan yang akan dimanfaatkan sebagai referensi dan panduan pada saat melakukan implementasi.

Panel Login dan Panel Registrasi

Panel Login digunakan untuk masuk ke aplikasi, sedangkan panel Registrasi digunakan untuk mendaftar sebagai pengguna baru.

  Pada halaman utama akan disediakan Panel Login yang dapat digunakan untuk:Sign In
Registrasi
Forget PasswordPada halaman ini juga terdapat logo aplikasi

 

Pada panel Registrasi, pengguna yang baru harus mengisikan data pribadi, dan saat Submit maka data tersebut akan dikirim ke server

Halaman Congratulation dan Halaman Menu Utama

Halaman Congratulation akan ditampilkan pada saat pengguna berhasil melakukan registrasi.

  Apabila pengguna berhasil melakukan rgistrasi, maka aplikasi akan berpindah ke halaman “Congratulation”, dan pada panel ini pengguna harus melakukan login untuk diijinkan masuk ke aplikasi.Apabila pengguna berhasil login, maka aplikasi akan berpindah ke halaman Utama. Pada halaman ini terdapat 6 layanan: Subject, Timetable, Notes, Exams and Task, Grades, dan Setting.

Halaman Subject dan SubjectNew

Dari menu utama, pengguna dapat mengakses matakuliah dengan mengklik tombol Subject.

  Halaman Subject New adalah untuk menambahkan matakuliah baru.Halaman Subject adalah untuk menampilkan seluruh matakuliah

Implementasi Layout

Pada bagian sebelumnya, Anda sudah berhasi membuat cetakan atau yang kita sebut dengandesign model. Sekarang tiba saatnya bagi Anda untuk mengimplementasikannya dengan menggunakan tools dan bahasa pemrograman.

Jalankan Eclipse, lalu buatlah sebuah proyek dengan ketentuan berikut:

Step 1

Buat proyek baru dengan parameter berikut:

  1. Project Name       : AplydroidPersa
  2. Target Name         : Android 2.2
  3. Application Name : AplydroidPersa
  4. Package Name     : www.aplysit.com
  5. Create Activity      : AplydroidPersa
  6. Min SDK Version : 8

Untuk mengganti judul yang akan muncul pada aplikasi, Anda dapat mengubahnya pada AplydroidPersa » res » values » string.xml menjadi seperti berikut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Selamat Datang</string>
    <string name="app_name">AplydroidPersa v1</string>
</resources>

Lalu klik kanan pada AplydroidPersa » Run As » Android Application maka hasilnya adalah seperti gambar berikut:

Step 2

Agar struktur aplikasi yang kita hasilkan lebih elegan, maka kita perlu mengganti nama file AplydroidPersa.java menjadi Login.java caranya: AplydroidPersa » src » www.aplysit.com» AplydroidPersa.java [klik kanan] » Refractor » Rename pada jendela yang muncul ketik Login lalu klik tombol Finish

Perhatikan bahwa Anda harus mengubah file AplydroidPersa » AndroidManifest.xml pada bagian

<activity android:name=".AplydroidPersa" android:label="@string/app_name">

menjadi

<activity android:name=".Login" android:label="@string/app_name">

Lalu cobalah jalankan kembali, dan pastikan hasilnya sesuai keinginan.

Lakukan rename file AplydroidPersa » res » layout » main.xml menjadi AplydroidPersa » res » layout » login.xml dan pastikan bahwa Anda melakukan perubahan yg sama pada file AplydroidPersa » src » www.aplysit.com » Login.java pada bagian:

setContentView(R.layout.main);

menjadi:

setContentView(R.layout.login);

Lalu cobalah jalankan kembali, dan pastikan hasilnya sesuai keinginan.

Persiapkan File Pendukung

Untuk menyelesaikan proyek ini, ada beberapa file pendukung yang kita perlukan yaitu beberapa file gambar. Caranya:
Dengan menggunakan Windows Explorer, buatah sebuah direktori baru bernama drawablepada lokasi proyek, misalnya: D:\10_Android\03_Project\AplydroidPersa\res\drawable
Tempatkan beberapa file gambar yang dibutuhkan bertipe .jpg, .bmp, atau .png pada folderdrawable tersebut.

Lalu di Eclipse, refresh proyek AplydroidPersa, sehingga hasilnya seperti berikut:

Konfigurasi Akses Internet dan Navigasi Halaman

Untuk dapat mengakses internet, maka Anda harus memastikan bahwa hak akses sudah disediakan. Demikian juga, agar dapat berpindah halaman, maka Anda harus mendaftarkan seluruh halaman tersebut. Seluruh konfigurasi ini diatur pada file file AplydroidPersa »AndroidManifest.xml sehingga menjadi seperti berikut:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="www.aplysit.com"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-permission android:name="android.permission.INTERNET" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Login"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".Mainmenu"></activity>
        <activity android:name=".Subject"></activity>
        <activity android:name=".SubjectNew"></activity>

    </application>
    <uses-sdk android:minSdkVersion="8" />

</manifest>

Perhatikan bahwa:

<activity android:name=".Mainmenu"></activity>
<activity android:name=".Subject"></activity>
<activity android:name=".SubjectNew"></activity>

berarti mendaftarkan Mainmenu, Subject, dan SubjectNew agar dapat diakses dari halaman lain, caranya pada file .java diberikan perintah berikut:

Intent I = null;
i = new Intent(this, Mainmenu.class);
startActivity(i);

 

Layout Login

Modifikasi file login.xml menjadi seperti gambar berikut:

Caranya dengan melakukan edit file login.xml menjadi seperti berikut:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget30"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<LinearLayout
android:id="@+id/widget35"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<AbsoluteLayout
android:id="@+id/widget31"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/banner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo"
android:layout_x="0px"
android:layout_y="-1px"
>
</ImageView>
</AbsoluteLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/widget42"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<AbsoluteLayout
android:id="@+id/widget44"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/widget113"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:layout_x="16px"
android:layout_y="39px"
>
</TextView>
<TextView
android:id="@+id/widget114"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Password"
android:layout_x="18px"
android:layout_y="85px"
>
</TextView>
<EditText
android:id="@+id/txt_main_username"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="93px"
android:layout_y="30px"
android:text=""
>
</EditText>
<EditText
android:id="@+id/txt_main_password"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="92px"
android:layout_y="78px"
android:text=""
android:inputType="textPassword"
>
</EditText>
<Button
android:id="@+id/btn_main_login"
android:layout_width="70px"
android:layout_height="wrap_content"
android:text="Login"
android:layout_x="90px"
android:layout_y="138px"
android:onClick="allclickhandler"
>
</Button>
<Button
android:id="@+id/btn_main_register"
android:layout_width="75px"
android:layout_height="wrap_content"
android:text="Register"
android:layout_x="160px"
android:layout_y="138px"
android:onClick="allclickhandler"
>
</Button>
<Button
android:id="@+id/btn_main_passwordrecovery"
android:layout_width="145px"
android:layout_height="wrap_content"
android:text="Password Recovery"
android:layout_x="90px"
android:layout_y="188px"
android:onClick="allclickhandler"
>
</Button>
</AbsoluteLayout>
</LinearLayout>
</LinearLayout>

Perhatikanah, bahwa pada saat pengguna melakukan klik terhadap tombol Cancel atau tombol Submit, maka  onClick=”allclickhandler” memberi makna bahwa aksi tersebut ditangani oleh method bernama allclickhandler().

Layout Registrasi

Dengan cara yang hampir sama seperti pembuatan Panel Login tadi, maka sekarang dilanjutkan membuat Panel Registrasi, sehingga hasilnya seperti gambar berikut ini.

  Widget yang dibutuhkan adalah:
ImageView : Logo pada bagian atas
TextView    : sebagai label
EditText     : sebagai kotak pengisian dataHal yang selalu diingat adalah menamakan masing-masing widget dengan benar dan representative, artinya untuk widget button register sebaiknya diberi nama btn_register dan untuk widget edittext email sebagiknya diberi nama txt_email.Dengan cara demikian, saat melakukan implementasi coding pada masing-masing widget, Anda tidak akan mengalami banyak kesulitan dalam hal mengidenfitikasi setiap widget tersebut.

Layout Menu Utama

Buatlah sebual file xml baru dengan cara AplydroidPersa\res\layout  » [klik kanan] »New » Android XML File lalu pada jendela yang terbuka isikan File: mainmenu.xml seperti gambar berikut:

  Sebagai hasilnya akan terdapat sebuah file padaAplydroidPersa\res\layout\mainmenu.xml

Pada menu utama terdapat enam menu yang masing-masing dibuat dengan menggunakan ImageButton. Widget ini berfungsi seperti layaknya sebuah button, namun dengan tampilkan berupa gambar.

  Widget yang dibutuhkan adalah:
ImageView    : Logo pada bagian atas
ImageButton : sebagai tombol menu
Dalam proyek ini, widget dinamakan sbb:
Subject    : btn_mainmenu_subject
Timetable : btn_mainmenu_timetable
Notes       : btn_mainmenu_notes
Exam       : btn_mainmenu_exam
Grade       : btn_mainmenu_grade
Setting     : btn_mainmenu_setting>

Untuk menampilkan gambar pada widget ImageButton adalah dengan mengatur propertyandroid:src seperti berikut:

<ImageButton
android:id="@+id/btn_mainmenu_subjects"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="285dip"
android:src="@drawable/mainmenu_subjects"
android:layout_x="25px"
android:layout_y="1px"
android:onClick="allclickhandler"
>

Properti android:onClick=”allclickhandler” artinya bahwa pada saat widget diklik, maka evet handler akan ditangani di dalam method allclickhandler().

Implementasi Event Handler

Pada bagian sebelumnya, Anda sudah berhasi membuat seluruh layout yang diatur di dalam file .xml maka sekarang Anda akan mengimplementasikan code program yang akan menangani setiap event yang dilakukan terhadap widget tersebut.

File Global.java

Kita membutuhkan sebuah file bernama global.java (boleh saja diberi nama lain, tidak masalah) yang akan menangani mekanisme koneksi dengan server, yaitu yang berhubungan dengan file persa.php dan file tersebut akan digunakan pada seluruh file *.java di AplydroidPersa apabila di dalamnya terdapat action untuk komunikasi dengan server lewat file persa.php.

Caranya AplydroidPersa » src » www.aplysit.com [klik kanan] » New » class
Lalu pada jendela New Java Class yang muncul, pada field Name: ketikkan Global (tanpa extension .java), lalu modifkasilah source code sehingga menjadi seperti berikut:

package www.aplysit.com;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;

public class Global {

    //private String URL = "http://www.aplysit.com/android/project";
    private String URL = "http://10.0.2.2/project";
    private String url = "";

    //——- BEGIN: EKSEKUSI QUERY DAN RETURN SEBUAH STRING ——————
    public String servicesimple(String param) {

        String response = "";

        try {
            url = URL + "/persa.php?" + param;
            response = call(url);
        } catch (Exception e) {
        }
        return response;
    }
    //——- END: EKSEKUSI QUERY DAN RETURN SEBUAH STRING ——————

    //——- BEGIN: EKSEKUSI QUERY DAN RETURN ARRAY UNTUK DATA TABEL ———-
    public String[] servicetable(String param) {
        url = URL + "/persa.php?" + param;
        HttpClient httpclient = new DefaultHttpClient();
        HttpRequestBase httpRequest = null;
        HttpResponse httpResponse = null;
        InputStream inputStream = null;
        String response = "";
        StringBuffer buffer = new StringBuffer();
        httpRequest = new HttpGet(url);
        try {
            httpResponse = httpclient.execute(httpRequest);
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        try {
            inputStream = httpResponse.getEntity().getContent();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] data = new byte[512];
        int len = 0;

        try {
            while (-1 != (len = inputStream.read(data))) {
                buffer.append(new String(data, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        response = buffer.toString();

        StringParser parser = new StringParser();

        return (content);
    }
    //——- END: EKSEKUSI QUERY DAN RETURN ARRAY UNTUK DATA TABEL —————

    //——- BEGIN: EKSEKUSI QUERY DAN RETURN SEBUAH ARRAY UNTUK DATA SPINNER —–
    public String[] servicespinner(String param) {
        url = URL + "/persa.php?" + param;
        HttpClient httpclient = new DefaultHttpClient();
        HttpRequestBase httpRequest = null;
        HttpResponse httpResponse = null;
        InputStream inputStream = null;
        String response = "";
        StringBuffer buffer = new StringBuffer();
        httpRequest = new HttpGet(url);
        try {
            httpResponse = httpclient.execute(httpRequest);
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        try {
            inputStream = httpResponse.getEntity().getContent();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] data = new byte[512];
        int len = 0;

        try {
            while (-1 != (len = inputStream.read(data))) {
                buffer.append(new String(data, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        response = buffer.toString();

        StringParser parser = new StringParser();

        return (content);
    }
    //——- END: EKSEKUSI QUERY DAN RETURN SEBUAH ARRAY UNTUK DATA SPINNER —-

    //——- BEGIN: UNTUK MENANGANI KONESI KE PHP, JANGAN DIUBAH ——————
    public String call(String url) {
        int BUFFER_SIZE = 2000;
        InputStream in = null;
        try {
            in = OpenHttpConnection(url);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return "";
        }

        InputStreamReader isr = new InputStreamReader(in);
        int charRead;
        String str = "";
        char[] inputBuffer = new char[BUFFER_SIZE];
        try {
            while ((charRead = isr.read(inputBuffer)) > 0) {
                //—convert the chars to a String—
                String readString
                        = String.copyValueOf(inputBuffer, 0, charRead);
                str += readString;
                inputBuffer = new char[BUFFER_SIZE];
            }
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        }
        return str;
    }

    private InputStream OpenHttpConnection(String urlString)
            throws IOException {
        InputStream in = null;
        int response = -1;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();

        if (!(conn instanceof HttpURLConnection)) {
            throw new IOException("Not an HTTP connection");
        }

        try {
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();

            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
            }
        } catch (Exception ex) {
            throw new IOException("Error connecting");
        }
        return in;
    }
    //——- END: UNTUK MENANGANI KONESI KE PHP, JANGAN DIUBAH ——————
}

Event Handler Login

Event handler ini akan menangani proses login, yaitu pada saat pengguna melakukan mengisi username dan password lalu menekan tombol Submit.

Perhatikan, bahwa dalam perancangan Anda memasangkan file login.xml dengan Login.java artinya bahwa layout diatur oleh login.xml sedangkan handler diatur oleh Login.java

Modifikasilah file Login.java agar menjadi seperti berikut ini:

package www.aplysit.com

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class Login extends Activity {

    public String nama;

    String user, pwd;
    String res;
    services service = new services();

    Spinner spn_reminder;
    private static final String[] array = {"satu", "dua"};

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Memanggil layout yang pertama sekali ditampilkan
        setContentView(R.layout.login);

    }

    // Bagian ini untuk handler button pada widget
    public void allclickhandler(View view) {

        Intent i = null;

        switch (view.getId()) {
            case R.id.btn_main_login:

                EditText userIn = (EditText) findViewById(R.id.txt_main_username);
                EditText passIn = (EditText) findViewById(R.id.txt_main_password);

                user = userIn.getText().toString();
                pwd = passIn.getText().toString();

                res = service.logIn(user, pwd);

                if (res.equals("1")) {
                    Toast.makeText(getApplicationContext(), "Welcome " + user, 50).show();
                    i = new Intent(this, Mainmenu.class);
                    startActivity(i);
                } else {
                    Toast.makeText(getApplicationContext(), "Login failed", 10).show();
                }
                break;
            case R.id.btn_main_passwordrecovery:
                i = new Intent(this, password_recovery.class);
                startActivity(i);
                ;
                break;
            case R.id.btn_main_register:
                i = new Intent(this, register.class);
                startActivity(i);
                ;
                break;

        }
    }

}

Perhatikan secara khusus bagian implementasi allclickhandler() yang mengimplementasikan switch()  untuk memeriksa widget mana yang diklik. Pada saat yang diklik adalah tombol Login (widget bernama btn_main_login) maka program akan mengeksekusi switch bagian pertama.

Event Handler Menu Utama

Buatlah sebuah class baru bernama Mainmenu.java (yang merupakan pasangan dari mainmenu.xml) lalu modifikas isinya sehingga menjadi seperti berikut ini:

package www.aplysit.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class Mainmenu extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Memanggil layout yang pertama sekali ditampilkan
        setContentView(R.layout.mainmenu);

    }

    // Bagian ini untuk handler button pada widget
    public void allclickhandler(View view) {

        Intent i = null;

        switch (view.getId()) {

            case R.id.btn_mainmenu_subjects:
                //Toast.makeText(getApplicationContext(), "SUBJECT",50).show();
                i = new Intent(this, Subject.class);
                startActivity(i);
                break;
            case R.id.btn_mainmenu_timetable:
                Toast.makeText(getApplicationContext(), "TIMETABLE", 50).show();
                //i = new Intent(this, timetable.class);
                //startActivity(i);
                break;
            case R.id.btn_mainmenu_notes:
                Toast.makeText(getApplicationContext(), "NOTES", 50).show();
                //i = new Intent(this, notes.class);
                //startActivity(i);
                break;
            case R.id.btn_mainmenu_setting:
                Toast.makeText(getApplicationContext(), "SETTING", 50).show();
                //i = new Intent(this, setting.class);
                //startActivity(i);
                break;
            case R.id.btn_mainmenu_exams:
                Toast.makeText(getApplicationContext(), "EXAMS", 50).show();
                //i = new Intent(this, exams.class);
                //startActivity(i);;
                break;
            case R.id.btn_mainmenu_grades:
                Toast.makeText(getApplicationContext(), "GRADES", 50).show();
                //i = new Intent(this, grades.class);
                //startActivity(i);;
                break;

        }
    }
}

Menu utama terdiri dari enam buah ImageButton, sehingga masing-masing image button harus diperiksa dengan switch().

Perhatikanlah bahwa seluruh handler terhadap widget yang terdapat pada login.xml dan mainmenu.xml ditangani oleh method bernama allclickhandler() namun tidak akan terjadi bentrok. Mengapa menggunakan nama yang sama? Tujuannya adalah agar lebih mudah melakukan penangan terhadap proyek besar yang memiliki banyak widget, sehingga dengan memeberikan nama yang sama, maka Anda sebagai programmer akan mudah mengidentifikasi method dari namanya. Mengapa tidak terjadi bentrok, padahal namanya sama? Tentu saja tidak terjadi bentrok, karena meskipun method memiliki nama yang sama namun diimplementasikan pada class yang berbeda.

Perintah berikut:

i = new Intent(this, Subject.class);
startActivity(i);

adalah untuk pindah dari satu halaman ke halaman lainnya (navigasi).

Event Handler Subject dan SubjectNew

Tampilan untuk halaman Subject adalah gambar kiri dan SubjectNew adalah pgambar kanan seperti gambar berikut:

 

Buatlah sebuah file baru, caranya AplydroidPersa » res » www.aplysit.com  [klik nana]»new »class lalu pada Name ketik Subject, dan modifikasi menjadi seperti source code berikut:

package www.aplysit.com;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class Subject extends Activity {

    //Buat objek global agar method dapat dikenali
    Global g = new Global();

    //Siapkan kamus data
    //subject_total adalah hasil return panjang array dibagi 4
    //karena dibutuhkan 4 kolom
    int urutan1, urutan2, urutan3, urutan4, delta1, delta2, delta3, delta4;
    int subject_total = (g.servicetable("c=SEL_subjectall").length) / 4;
    String[] data_list = new String[subject_total];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.subject);

        //Ambil subjectall
        data_list = g.servicetable("c=SEL_subjectall");

        //—- BEGIN: MEMBUAT JUDUL TABEL —–
        TableLayout TL = (TableLayout) findViewById(R.id.wadah);
        TableLayout.LayoutParams ParameterTableLayout = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);

        TableRow TR_title = new TableRow(this);
        TR_title.setLayoutParams(ParameterTableLayout);
        TableRow.LayoutParams ParameterTableRow_title = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
        ParameterTableRow_title.setMargins(1, 1, 1, 1);

        TextView TV0 = new TextView(this);
        TV0.setText("Code");
        TV0.setTextColor(Color.WHITE);
        TV0.setPadding(2, 5, 2, 5);
        TV0.setGravity(Gravity.CENTER);
        TV0.setBackgroundColor(Color.GRAY);
        TV0.setTypeface(null, Typeface.BOLD);
        TR_title.addView(TV0, ParameterTableRow_title);

        TextView TV1 = new TextView(this);
        TV1.setText("Subject");
        TV1.setTextColor(Color.WHITE);
        TV1.setPadding(2, 5, 2, 5);
        TV1.setGravity(Gravity.CENTER);
        TV1.setBackgroundColor(Color.GRAY);
        TV1.setTypeface(null, Typeface.BOLD);
        TR_title.addView(TV1, ParameterTableRow_title);

        TextView TV2 = new TextView(this);
        TV2.setText("Crd");
        TV2.setTextColor(Color.WHITE);
        TV2.setPadding(2, 5, 2, 5);
        TV2.setGravity(Gravity.CENTER);
        TV2.setBackgroundColor(Color.GRAY);
        TV2.setTypeface(null, Typeface.BOLD);
        TR_title.addView(TV2, ParameterTableRow_title);

        TextView TV3 = new TextView(this);
        TV3.setText("Lecturer");
        TV3.setTextColor(Color.WHITE);
        TV3.setPadding(2, 5, 2, 5);
        TV3.setGravity(Gravity.CENTER);
        TV3.setBackgroundColor(Color.GRAY);
        TV3.setTypeface(null, Typeface.BOLD);
        TR_title.addView(TV3, ParameterTableRow_title);

        TL.addView(TR_title);

        //—- END: MEMBUAT JUDUL TABEL —–
        //—- BEGIN: MEMBUAT ISI TABEL —–
        delta1 = -2;
        delta2 = 0;
        delta3 = 1;
        delta4 = 0;

        for (int awal = 0; awal < subject_total; awal++) {

            TableRow TR_content = new TableRow(this);
            TR_content.setLayoutParams(ParameterTableLayout);
            TableRow.LayoutParams ParameterTableRow_content = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
            ParameterTableRow_content.setMargins(1, 1, 1, 1);

            urutan1 = (((awal + 1) * 3) + delta1) - 1;
            TextView TV0_content = new TextView(this);
            TV0_content.setText(data_list[urutan1]);
            TV0_content.setTextColor(Color.WHITE);
            TV0_content.setPadding(2, 5, 2, 5);
            TV0_content.setGravity(Gravity.LEFT);
            TV0_content.setBackgroundColor(Color.DKGRAY);
            TR_content.addView(TV0_content, ParameterTableRow_content);
            delta1 = delta1 + 1;

            urutan2 = (((awal + 1) * 2) + delta2) - 1;
            TextView TV1_content = new TextView(this);
            TV1_content.setText(data_list[urutan2]);
            TV1_content.setTextColor(Color.WHITE);
            TV1_content.setPadding(2, 5, 2, 5);
            TV1_content.setGravity(Gravity.LEFT);
            TV1_content.setBackgroundColor(Color.DKGRAY);
            TR_content.addView(TV1_content, ParameterTableRow_content);
            delta2 = delta2 + 2;

            urutan3 = (((awal + 1) * 2) + delta3) - 1;
            TextView TV2_content = new TextView(this);
            TV2_content.setText(data_list[urutan3]);
            TV2_content.setTextColor(Color.WHITE);
            TV2_content.setPadding(2, 5, 2, 5);
            TV2_content.setGravity(Gravity.CENTER);
            TV2_content.setBackgroundColor(Color.DKGRAY);
            TR_content.addView(TV2_content, ParameterTableRow_content);
            delta3 = delta3 + 2;

            urutan4 = (((awal + 1) * 4) + delta4) - 1;
            TextView TV3_content = new TextView(this);
            TV3_content.setText(data_list[urutan4]);
            TV3_content.setTextColor(Color.WHITE);
            TV3_content.setPadding(2, 5, 2, 5);
            TV3_content.setGravity(Gravity.LEFT);
            TV3_content.setBackgroundColor(Color.DKGRAY);
            TR_content.addView(TV3_content, ParameterTableRow_content);
            delta4 = delta4 + 0;

            TL.addView(TR_content);

        }
        //—- END: MEMBUAT ISI TABEL —–
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, Menu.FIRST, 0, R.string.backtomainmenu); //di ambil dari values > string.xml
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {

        Intent i = new Intent(this, Mainmenu.class);
        startActivity(i);
        return false;
    }

    public void allclickhandler(View view) {

        Intent i = null;
        switch (view.getId()) {

            case R.id.btn_subject_new:
                i = new Intent(this, SubjectNew.class);
                startActivity(i);
                break;

        }

    }
}

Buatlah sebuah file baru, caranya AplydroidPersa » res » www.aplysit.com  [klik nana]»new »class lalu pada Name ketik SubjectNew, dan modifikasi menjadi seperti source code berikut:

package www.aplysit.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class SubjectNew extends Activity {

    //Buat objek global agar method dapat dikenali
    Global g = new Global();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.subjectnew);

        //Mengisi data spinner Term
        Spinner spn_subjecstnew_term = (Spinner) findViewById(R.id.spn_subjecstnew_term);
        String[] content = g.servicesinner("c=SEL_nameterm");
        ArrayAdapter adapter_term = new ArrayAdapter(this, android.R.layout.simple_spinner_item, content);
        adapter_term.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spn_subjecstnew_term.setAdapter(adapter_term);
    }

    public void allclickhandler(View view) {

        Intent i = null;
        switch (view.getId()) {
            case R.id.btn_subjectnew_save:

                //Semua fied harus diisi, lakukan pemerikaan pastikan bahwa field terisi
                String code = ((EditText) findViewById(R.id.txt_subjectnew_code)).getText().toString();
                String name = ((EditText) findViewById(R.id.txt_subjectnew_name)).getText().toString();
                String credit = ((EditText) findViewById(R.id.txt_subjectnew_credit)).getText().toString();
                String lecturer = ((EditText) findViewById(R.id.txt_subjectnew_lecture)).getText().toString();
                String assistant = ((EditText) findViewById(R.id.txt_subjectnew_assistant)).getText().toString();
                String description = ((EditText) findViewById(R.id.txt_subjectnew_desc)).getText().toString();
                String book = ((EditText) findViewById(R.id.txt_subjectnew_book)).getText().toString();

                if ((code.equals("")) || (name.equals("")) || (credit.equals("")) || (lecturer.equals("")) || (assistant.equals("")) || (description.equals("")) || (book.equals(""))) {
                    Toast.makeText(getApplicationContext(), "All fields are mandatory", 20).show();
                    break;
                }

                //Siapkan parameter, dan panggil service yang melakukan koneksi ke server
                String parameter = "c=INS_subject&code=" + code + "&name=" + name + "&credit=" + credit + "&lect=" + lecturer + "&ass=" + assistant + "&desc=" + description + "&book=" + book;
                String response = g.servicesimple(parameter);

                //Melihat paramater yang dikirimkan
                //Toast.makeText(getApplicationContext(), parameter, 20).show();
                //Redirect ke halaman Subject
                i = new Intent(this, Subject.class);
                startActivity(i);
                break;

            case R.id.btn_subjectnew_cancel:
                i = new Intent(this, Subject.class);
                startActivity(i);
                break;

        }

    }

    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, Menu.FIRST, 0, R.string.backtomainmenu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {

        Intent i = new Intent(this, Mainmenu.class);
        startActivity(i);
        return false;
    }

}

Implementasi file persa.php

Pada proyek ini, aplikasi AplydroidPersa yang dibuat hanyalah sebuah sarana untuk mengakses data yang tersimpan di server. Jadi sama halnya seperti menggunakan laptop untuk mengakses facebook, tentu saja datanya tersimpan pada server (bukan pada computer/laptop/hp).

Maka kita perlu menyiapkan data pada server, yaitu disimpan pada DBMS MySQL dan diakses dengan script php.

Berikut adalah struktur database, digunakan dua table: tbl_user dan tbl_subject

 


Berikut adalah file persa.php

<?php
/*
<!-- File: persa.php -->
<!-- www.aplysit.com -->
<!-- Nama proyek: AplydroidPersa -->
*/

//Mengatur koneksi ke basis data
mysql_connect("localhost","root","");
mysql_select_db("persa");

//step 3: activate global variable
extract($_REQUEST, EXTR_OVERWRITE);

//==============================================
// Bagian ini untuk menangani proses Sign In
//==============================================
if ($c=="s"){
   //echo "1"; exit;

   $sql  = "SELECT * FROM tbl_user ";
   $sql .= "WHERE email = '$k' AND password = '$p' ";

   $result = mysql_query($sql) or die ("3");
   $row = mysql_num_rows($result);
   if ($row > 0) {
       $sql  = "UPDATE tbl_user set status = 'online' ";
	   $sql .= "WHERE email = '$k'";
       $result = mysql_query($sql) or die ("2");
       if ($result) {
          echo "1";
       }
   }
   else {
      echo "2";
   }
}

//==============================================
// Bagian ini untuk mencari nama term
//==============================================
else if ($c=="SEL_nameterm"){
	// Query ini bila tidak berhasil bisa
	// diganti query yang dibagian bawahnya
	// Perintah ! diganti menjadi NOT
    $sql  = "SELECT * FROM tbl_term ";
	$sql .= "WHERE isactive='1' ";
	$sql .= "AND id_term > 1 ";
	$sql .= "ORDER BY nameterm ";

    $result = mysql_query($sql) or die ("gagal");

    $spce = "#";
    $row=mysql_num_rows($result);
	if (!$row == 0){
		while ($data = mysql_fetch_array($result)){
		  $nameterm .= $data["nameterm"].$spce;
		}
	   echo "$nameterm";
	}
	else {
	   echo "0_";
	}
}

//==============================================
// Bagian ini untuk INSERT SUBJECT
//==============================================
else if ($c=="INS_subject"){
	// Query ini bila tidak berhasil bisa
	// diganti query yang dibagian bawahnya
	// Perintah ! diganti menjadi NOT
    $sql  = "INSERT INTO tbl_subject (id_term,code,namesubject,namesubjectshort,credit,lecturer,assistant,description,book) ";
	$sql .= "VALUES (2,'$code','$name','XX','$credit','$lect','$ass','$desc','$book') ";

    $result = mysql_query($sql) or die ("gagal");

    echo "Berhasil";
}

//==============================================
// Bagian ini untuk mengambil semuasubject
//==============================================
else if ($c=="SEL_subjectall"){
	// Query ini bila tidak berhasil bisa
	// diganti query yang dibagian bawahnya
	// Perintah ! diganti menjadi NOT
    $sql  = "SELECT * FROM tbl_subject ";
	$sql .= "WHERE isactive='1' ";
	$sql .= "AND id_subject > 1 ";
	$sql .= "ORDER BY namesubject ";

    $result = mysql_query($sql) or die ("gagal");

    $spce = "#";
    $row = mysql_num_rows($result);

	if (!$row == 0){
		while ($data = mysql_fetch_array($result)){
		  $hasil .= $data["code"].$spce.$data["namesubject"].$spce.$data["credit"].$spce.$data["lecturer"].$spce;
		}
	   echo $hasil;
	}
	else {
	   echo "0_";
	}
}

?>

 

Lakukan test script dengan cara memanggilnya langsung seperti berikut

Address URL: http://localhost/project/persa.php?c=s&k=cindy@aplysit.com&p=cindy

Address URL: http://localhost/project/persa.php?c=SEL_subjectall



Berikut seluruh tampilkan bila apliksi AplydroidPersa dijalankan:

 
  Tampilan New Subject

Source code proyek, database, dan script php, dapat di download di sini: AplydroidPersa

Like or Share This Article




COMMENTS ( 0 )
./foto_users/small_no_avatar.jpg
Comment #1
Guntur Restu Pperdana 27 Desember 2014 (12:05:44)
mas mau tanya, itu spinner nya kok ngga mau nyimpen di database ya ? yang lainnya bisa .. mohon bimbingannya mas 

./foto_users/small_no_avatar.jpg
Comment #2
Rofianto 11 Juni 2015 (17:10:50)
keren ni :D

mas mau tanya,, kemarin saya beli buku yg jidil nya "Membongkar SourceCode Berbagai Aplikasi" dsna jg di sediakan CD ,, yg mau saya tanyakan Eclipse galileo nya agak kurang support ke laptop saya,, seperti saat buka awal akan muncul workspace nya,, tpi di laptop saya gada,, apakah bit pada komputer mempengaruhi jg,, mohon bimbingannya baru belajar mengenal android:D

./foto_users/small_no_avatar.jpg
Comment #3
Tria Wijaya 26 Oktober 2015 (09:46:21)
Mohon pencerahannya dong mas, kenapa Eclipse Galileo ketika mau saya jalankan lagi kenapa ada errornya/ tidak mau jalan.
Mohon solusinya..

 
Keep connected with us, mobile apps available now !!