Jumat, 10 Oktober 2014

Contoh Menu Display (Client-Server Android)

Berikut keterhubungan antar class untuk Menu Display.
 
Sebelum sistem android dapat menjalankan aplikasi Menu Display ini, sistem terlebih dahulu harus tahu bahwa komponen aplikasi memang ada, yakni dengan cara membaca file "AndroidManifest.xml". Pada file manifest dideklarasikan komponen aplikasi. Misalnya untuk contoh menu ini dibutuhkan perijinan akses internet untuk dapat melakukan koneksi ke database yang tersimpan pada localhost dari emulator dengan alamat "http://10.0.2.2". Dimana pada localhost inilah file "getUser.php" dan "connect_db.php" tersimpan.

 Jadi, pertama kali pastikan Anda telah update isi file "AndroidManifest.xml" sebagai berikut.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.contoh"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
   //untuk koneksi internet
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.contoh.DisplayActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      </application>

</manifest>



Berdasarkan "android.intent.category.LAUNCHER" pada file manifest, class "DisplayActivity.java" lah yang akan diakses pertama kali ketika sistem dijalankan. Berikut soruce code untuk "DisplayActivity.java" yang tersimpan pada folder "src" dari struktur direktori android.
package com.example.contoh;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class DisplayActivity extends Activity{
    private final String urlContoh = "http://10.0.2.2/contoh/getUser.php";     //koneksi database ke localhost
    private UserAdapter adapter;
    private ListView listUser;  
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display);              
        adapter = new UserAdapter(this, R.id.textView1);
        loadDataUser();      
        listUser = (ListView) findViewById(R.id.listViewUser);      
        listUser.setAdapter(adapter);      
    }
    private void loadDataUser(){
        try {
            String jsonString = DisplayActivity.getRequestFromServer(urlContoh);
            Log.w("Load User", jsonString);
            JSONObject jObject = new JSONObject(jsonString);
            JSONArray newsJsonArray = jObject.getJSONArray("user");
            Log.w("Load data User", "Size = "+newsJsonArray.length());
            for (int i = 0; i < newsJsonArray.length(); i++) {
                User user = new User(newsJsonArray.getJSONObject(i));
                adapter.add(user);
            }
            adapter.notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    class UserAdapter extends ArrayAdapter<User>{      
        public UserAdapter(Context context, int resource) {
            super(context, resource);          
        }
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){
                convertView = ((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_adapter, parent,false);
            }                      
            TextView usernameUser = (TextView) convertView.findViewById(R.id.textViewUsername);          
            TextView passwordUser = (TextView) convertView.findViewById(R.id.textViewPassword);
            User entityUser = getItem(position);
            usernameUser.setText(entityUser.username);
            passwordUser.setText(entityUser.password);                      
            return convertView;
        }
    }
   public static String getRequestFromServer(String url){  
        try {
            Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                    .getContextClassLoader());
            Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
                    .currentThread().getContextClassLoader());
            Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
                    Thread.currentThread().getContextClassLoader());
            Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
            Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
            Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
            Method buildMethod = threadPolicyBuilderClass.getMethod("build");
            Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
            Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();
            Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);
            obj = penaltyMethod.invoke(obj);
            Object threadPolicyObject = buildMethod.invoke(obj);
            setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);
        } catch (Exception ex) {
            Log.w("Thread Policy", ex);
        }
        String result = "Succeed";
        HttpClient client = new DefaultHttpClient();
        HttpClientParams.setRedirecting(client.getParams(), true);
        HttpGet request = new HttpGet(url);
        try{
            HttpResponse response = client.execute(request);
            InputStream in = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            int lineCount = 0;
            while((line = reader.readLine()) != null){
                if(lineCount>0) str.append("\n");
                str.append(line);
            }
            in.close();
            result = str.toString();
            Log.w("get Request", "asli : "+result);
            if(result.indexOf("<") > 0){
                result = result.substring(0, result.indexOf("<"));
            }
            Log.w("get Request", "proses : "+Html.fromHtml(result));
            return Html.fromHtml(result).toString();          
        }catch(Exception ex){
            ex.printStackTrace();
            result = "Error";
        }
        return result;
    }
}

 

Perhatikan bagian "http://10.0.2.2/contoh/getUser.php", bahwa file "getUser.php" (query untuk mengambil data username dan password) tersimpan pada folder "contoh" di htdocs. Berikut source code untuk file "getUser.php".
<?php
include "connect_db.php";
$query = "SELECT username,password FROM tbuser";
$result = mysql_query($query, $link) or die('Errorquery:  '.$query);
$rows = array();
while ($r = mysql_fetch_assoc($result)) {
    $rows[] = $r;
}
$data = "{user:".json_encode($rows)."}";
echo $data;
?>


Perhatikan bagian include "connect_db.php", bahwa source code untuk koneksi ke root dari localhost terdapat pada file "connect_db.php".
 <?php
$link = mysql_connect('localhost', 'root', '') or die('Cannot connect to the DB');
mysql_select_db('dbcontoh') or die('Cannot select the DB');
?>


Terakhir, tampilan layout dari Menu Display ini tersimpan pada file "activity_display.xml" yang dideklarasikan pada "DisplayActivity.java" bagian setContentView(R.layout.activity_display). Berikut soruce code untuk "activity_display.xml" yang tersimpan pada folder "layout" dari struktur direktori android.
<?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="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"    
        android:orientation="vertical" >
        <ListView
            android:id="@+id/listViewUser"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:dividerHeight="5dp" >
        </ListView>
    </LinearLayout> 
</LinearLayout>


Pada "activity_display.xml" di atas, hanya menyediakan widget  <ListView untuk menampilkan data username dan password hasil query "getUser.php". Sedangkan format tampilan untuk data username dan password tersebut dilakukan oleh "activity_adapter.xml".  Pertama data diperoleh melalui fungsi loadDataUser() pada "DisplayActivity.java". Fungsi loadDataUser() ini memanggil class "User.java" melalui sintax User user = new User(newsJsonArray.getJSONObject(i)) dalam format JSON. Berikut source code untuk file "User.java".
package com.example.contoh;
import org.json.JSONException;
import org.json.JSONObject;
public class User {  
    public String username;
    public String password;  
    public User(JSONObject json){
        super();
        try {          
            this.username = json.getString("username");
            this.password = json.getString("password");                      
        } catch (JSONException e) {
            e.printStackTrace();
        }      
    }
}


Selanjutnya data JSON ini akan disimpan dalam adapter, adapter.add(user). Agar dapat ditampilkan dalam format ListView, maka dilakukan parsing JSON dari objek User menjadi View oleh class UserAdapter extends ArrayAdapter<User>. Data yang diperoleh dari hasil parsing JSON ini akan ditampilkan seperti layout "activity_adapter.xml", yakni data username dan password bertipe <TextView. Berikut source code untuk file "activity_adapter.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="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/textViewUsername"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:text="Username" />
    </LinearLayout>
    <TextView
        android:id="@+id/textViewPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password" />
</LinearLayout>


Lakukan running program. Selamat! Anda telah membuat Menu Display seperti terlihat dibawah ini.



Silakan lihat posting "Contoh Aplikasi Client-Server Android" pada blog ini untuk mengetahui langkah detail bagaimana membuat projek baru Android menggunakan eclipse untuk Menu Display ini.

1 komentar:

  1. bu kalo nampilinnya tanpa listview gimana yah? tampilinya mau di textview saja

    BalasHapus