Sebelum sistem android dapat menjalankan aplikasi Menu Update, 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 Update 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", "updateUser.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.UpdateActivity"
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="com.example.contoh.DetailUpdateActivity"
android:label="@string/title_activity_insert" >
</activity>
</application>
</manifest>
Berdasarkan "android.intent.category.LAUNCHER" pada file manifest, class "UpdateActivity.java" lah yang akan diakses pertama kali ketika sistem dijalankan. Berikut soruce code untuk "UpdateActivity.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.content.Intent;
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.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class UpdateActivity extends Activity implements OnItemClickListener{
private final String urlDisplay = "http://10.0.2.2/contoh/getUser.php"; //koneksi database ke localhost
private UserAdapter adapter;
private ListView listUser;
private static UpdateActivity instance;
public User selectedUser;
public static UpdateActivity getInstance(){
if(instance == null){
instance = new UpdateActivity();
}
return instance;
}
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);
listUser.setOnItemClickListener(this);
}
private void loadDataUser(){
try { String jsonString = DisplayActivity.getRequestFromServer(urlDisplay);
JSONObject jObject = new JSONObject(jsonString);
JSONArray newsJsonArray = jObject.getJSONArray("user");
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 void onItemClick(AdapterView<?> adapterV, View view, int position, long id) {
UpdateActivity.getInstance().selectedUser = adapter.getItem(position);
startActivity(new Intent(this, DetailUpdateActivity.class));
finish();
}
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;
}
}
Logika Menu Update ini adalah data username dan password akan ditampilkan lebih dulu. Kemudian sistem akan menampilkan data berdasarkan aksi sentuh pada salah satu record yang ditampilkan pada layar melalui fungsi UpdateActivity.getInstance().selectedUser = adapter.getItem(position). Satu record data username dan password tersebut akan ditampilkan melalui pemanggilan class "DetailUpdateActivity.java", startActivity(new Intent(this, DetailUpdateActivity.class)). Berikut source code untuk file "DetailUpdateActivity.java".
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 android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class DetailUpdateActivity extends Activity implements OnClickListener{
Button buttonUpdate;
private EditText editPassword;
private final String urlUpdate = "http://10.0.2.2/contoh/updateUser.php";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);
TextView usernameUser = (TextView) findViewById(R.id.textViewUsername);
usernameUser.setText(UpdateActivity.getInstance().selectedUser.username);
TextView newPasswordUser = (TextView) findViewById(R.id.textViewNewPassword);
buttonUpdate = (Button) findViewById(R.id.buttonUpdate);
buttonUpdate.setOnClickListener(this);
editPassword = (EditText) findViewById(R.id.editTextPassword);
}
public void onClick(View view) {
if(view.equals(buttonUpdate)){
try { String url = DetailUpdateActivity.getRequestFromServer(urlUpdate+"?username="+UpdateActivity.getInstance().selectedUser.username+
"&password="+editPassword.getText().toString());
Toast.makeText(this, url, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, "Error: "+ e.getMessage(), Toast.LENGTH_LONG).show();
}
}
startActivity(new Intent(this, UpdateActivity.class));
finish();
}
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/updateUser.php", bahwa file "updateUser.php" (query untuk mengubah data password) tersimpan pada folder "contoh" di htdocs. Berikut source code untuk file "updateUser.php".
<?php
$username = $_GET['username'];
$password = $_GET['password'];
include "connect_db.php";
$query = "update tbuser set password = '$password' where username ='".$username."' ";
$result = mysql_query($query, $link) or die('Error query: '.$query);
echo $result;
?>
Berikut tampilan layout untuk melakukan pengubahan data password dari data username yang telah dipilih oleh user sebelumnya pada class "UpdateActivity.java". Layout Menu Update ini tersimpan pada file "activity_update.xml" yang dideklarasikan pada "DetailUpdateActivity.java" bagian setContentView(R.layout.activity_update). Berikut soruce code untuk "activity_update.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: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/textViewNewPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Password" />
<EditText
android:id="@+id/editTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp" >
<Button
android:id="@+id/buttonUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UPDATE" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1" >
</LinearLayout>
</LinearLayout>
</LinearLayout>
Penjelasan source code mengenai bagaimana sistem menampilkan data tersebut, silakan lihat penjelasan posting Contoh Menu Display (Client-Server Android). Berikut tampilan layout "activity_update.xml".
Setelah aksi salah satu record terhapus, sistem akan melakukan refresh dan akan menampilkan kembali ListView untuk data username dan password melalui pemanggilan class UpdateActivity.java, startActivity(new Intent(this, UpdateActivity.class)).
Silakan lihat posting "Contoh Aplikasi Client-Server Android" pada blog ini untuk mengetahui langkah detail bagaimana membuat projek baru Android menggunakan eclipse untuk Menu Delete ini.
Tidak ada komentar:
Posting Komentar