The document summarizes key aspects of Android Studio and building Android apps. It covers activity lifecycles, creating user interfaces with Java code, event handling, gestures, fragments, and building a workout adviser app. Some key points include how to override lifecycle methods, add click listeners, handle touch events, create and connect fragments, and get workout recommendations from a WorkoutExpert class based on a spinner selection.
The document summarizes key aspects of Android Studio and building Android apps. It covers activity lifecycles, creating user interfaces with Java code, event handling, gestures, fragments, and building a workout adviser app. Some key points include how to override lifecycle methods, add click listeners, handle touch events, create and connect fragments, and get workout recommendations from a WorkoutExpert class based on a spinner selection.
The document summarizes key aspects of Android Studio and building Android apps. It covers activity lifecycles, creating user interfaces with Java code, event handling, gestures, fragments, and building a workout adviser app. Some key points include how to override lifecycle methods, add click listeners, handle touch events, create and connect fragments, and get workout recommendations from a WorkoutExpert class based on a spinner selection.
onRestart, onDestroy, onSaveInstanceState, onRestoreInstanceState Alt + insert override methods Import android.util.Log; ---psvm--- Private static final String TAG = “MyMessage”; @override Protected void onStart(){ Super.onStart(); Log.i(TAG, “onStart”); } Dst Membuka app onCreate, onStart, onResume Menekan back button onPause, onStop, onDestroy App dibuka kembali onCreate, onStart, onResume Menekan home button onPause, onSaveInstance, onStop App dibuka kembali onRestart, onStart, onResume Membuat user interface menggunakan java Import android.app.Activity; Import android.os.Bundle; Import android.widget.RelativeLayout; Import android.widget.Button; Import android.graphics.Color; Import android.widget.EditText; Import android.content.res.Resources; Import android.util.TypedValue; Public class mainActivity extends Activity { //onCreate method yg sudah dibuat dari sana sebagian code nya dihapus menjadi sbg berikut @override Protected void onCreate(Bundle savedInstanceState) { Super.onCreate(savedInstanceState); //membuat RelativeLayout dan Button RelativeLayout myLayout = new RelativeLayout(this); Button myButton = new Button(this); //mengganti background color di myLayout dan myButton myLayout.setBackgroundColor(Color.BLUE); myButton.setBackgroundColor(Color.GREEN); //mengganti teks dalam myButton myButton.setText(“Click Here”); //menentukan letak myButton RelativeLayout.LayoutParams buttonDetails = New RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT ); ButtonDetails.addRule(RelativeLayout.CENTER_HORIZONTAL); ButtonDetails.addRule(RelativeLayout.CENTER_VERTICAL); //menambahkan button dan ButtonDetails ke dalam myLayout myLayout.addView(myButton, ButtonDetails); //membuat EditText EditText username = new EditText (this); //set id myButton.setId(1); username.setId(2); //menentukan letak username RelativeLayout.LayoutParams usernameDetails = New RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT ); usernameDetails.addRule(RelativeLayout.ABOVE, myButton.getId()); usernameDetails.addRule(RelativeLayout.CENTER_HORIZONTAL); //convert DIP ke pixel Resources r = getResources(); Int pixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, r.getDisplayMetrics()); //mengatur panjangnya username menggunakan DIP yang sudah diconvert ke pixels Username.setWidth(pixels); //menambahkan margin (left, top, right, bottom) usernameDetails.setMargins(0,0,0,50); //menambahkan username dan usernameDetails ke myLayout myLayout.addView(username, usernameDetails); //menampilkan myLayout di screen setContentView(myLayout); } Grid layout Event handling apa yang terjadi bila kita klik, double tap, dll (terkandung dari event listener dan callback method) Import android.os.Bundle; Import android.support.v7.app.AppCompatActivity; Import android.view.View; Import android.widget.Button; Import android.widget.TextView; ---dalam onCreate--- //mendapatkan id button (id dari button nya adalah myButton) Button myButton = (Button) findViewById(R.Id.myButton); //action listener myButton.setOnClickListener( New Button.OnClickListener(){ //callback method Public void onClick(View v) { TextView myText = (TextView) findViewById(R.Id.myText); MyText.setText(“Button Clicked”); }}) //long click action listener myButton.setOnLongClickListener( New Button.OnLongClickListener(){ //Callback method menggunakan boolean Public boolean onLongClick (View v){ TextView myText = (TextView) findViewById(R.id.myText); MyText.setText(“long button Pressed”); Return true; }}) Gestures double tap, scroll, fling, dll Import android.os.Bundle; Import android.support.v7.app.AppCompatActivity; Import android.widget.TextView; Import android.view.MotionEvent; Import android.view.GestureDetector; Import android.support.v4.view.GestureDetectorCompat; Public class MainActivity extends AppCompactActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ //membuat text view dan gesture detector Private TextView myMessage; Private GestureDetector gestureDetector; ---di dalam onCreate--- myMessage = (TextView) findViewById(R.id.myMessage); this.gestureDetector = new GestureDetector(this,this); gestureDetector.setOnDoubleTapListener(this); //alt + insert implement methods @override Public boolean onTouchEvent(MotionEvent event){ This.gestureDetector.onTouchEvent(event); Return super.onTouchEvent(event); } @override Public boolean onSingleTapConfirmed(MotionEvent e){ myMessage.setText(“Single tap confirmed”); return false; } Dst Fragments 2 activity dalam sebuah activity, misal activity bagian atas merupakan text dan tombol sedangkan activity bagian bawah adalah gambar Res, drawable untuk semua gambar yg akan digunakan di aplikasi menggunakan copy paste, penamaan tidak boleh menggunakan angka cara membuat layout fragment xml layout, new, layoutresourcefile, nama : top_section_fragment.xml (terserah), root element = RelativeLayout cara membuat java class untuk fragment klik folder java, klik kanan subfolder com.blablabla, create new class ---top_section_fragment.xml--- <EditText Android:layout_width=”wrap_content” Android:layout_height=”wrap_content” Android:id=”@+id/topTextInput” Android:layout_centerHorizontal=”true” Android:layout_marginTop=”15dp” Android:width=”300dp” /> <Button Android:layout_width=”wrap_content” Android:layout_height=”wrap_content” Android:id=”@+id/button” Android:layout_centerHorizontal=”true” Android:layout_marginTop=”55dp” Android:text=”click here” /> ---bottom_picture_fragment.xml--- Design, properties (kanan), background, project, drawable, select image ---TopSectionFragment.java--- Import android.os.Bundle; Import android.support.annotation.Nullable; Import android.support.v4.app.Fragment; Import android.view.LayoutInflater; Import android.view.View; Import android.view.ViewGroup; Public class TopSectionFragment extends Fragment { //alt+insert, override methods, onCreateView, ok @Nullable @Override Public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.top_section_fragment,container,false); Return view; }} ---BottomPictureFragment.java--- Import android.os.Bundle; Import android.support.annotation.Nullable; Import android.support.v4.app.Fragment; Import android.view.LayoutInflater; Import android.view.View; Import android.view.ViewGroup; Public class TopSectionFragment extends Fragment { @Nullable @Override Public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.bottom_picture_fragment,container,false); Return view; }} ---content_main.xml--- Design, custom, <fragment>, TopSectionFragment & BottomSectionFragment, ok, klik @layout/top_section_fragment Workout adviser ---content_find_workout.xml--- (text, bisa tinggal di drag and drop di design) <Spinner Android:layout_width=”wrap_content” Android:layout_height=”wrap_content” Android:id=”@+id/workouttype” Android:layout_marginTop=”35dp” Android:layout_alignParentTop=”true” //memasukkan item dalam strings.xml ke sini (workout_types merupakan nama array) Android:entries=”@array/workout_types” /> <TextView Android:id=”@+id/workout” Android:layout_width=”wrap_content” Android:layout_height=”wrap_content” Android:text=”your workouts here” Android:layout_below=”@+id/findworkout” /> <Button Android:layout_width=”wrap_content” Android:layout_height=”wrap_content” Android:id=”@+id/findworkout” Android:text=”new button” Android:layout_alignLeft=”@+id/workouttype” //jika menggunakan relative layout, widget bisa diletakkan dibawah widget lain. (button diletakkan di bawah text view menggunakan id text view) Android:layout_below=”@+id/workouttype” //menambahkan onClick (apa yang akan terjadi jika button di klik) di xml Android:onClick=”onClickFindWorkout” /> ---strings.xml--- <string name = blablabla strings yg digunakan untuk layout aplikasi</string> <string-array name=”workout_types”> <item>Chest</item> <item>biceps</item> <item>triceps</item> <item>shoulders</item> </string-array> ---FindWorkoutActivity.java--- (main activity) Import android.os.Bundle; Import android.app.Activity; Import android.support.v7.app.AppCompatActivity; Import android.view.View; Public class FindWorkoutActivity extends Activity{ //membuat object dari class WorkoutExpert Private WorkoutExpert expert = new WorkoutExpert(); @Override --onCreate—{} Public void onClickFindWorkout (View view){ TextView workouts = (TextView) findViewById(R.id.workout); Spinner workouttype = (Spinner) findViewById(R.id.workouttype); //mendapatkan item yang dipilih dalam spinner String workout = String.valueOf(workouttype.getSelectedItem()); //Workouts.setText(workout); Hasil ada spinner dengan pilihan shoulders, biseps, dll dan jika salah satu dipilih dan tekan tombol maka textView akan diganti menjadi polihan yg dipilih (biseps,dll) List<String> workoutList = expert.getWorkouts(workout); StringBuilder workoutFormatted = new StringBuilder(); //membuat for each loop untuk items dalam workoutList (listString dalam xml) For(String work : workoutList){ //menyambungkan string builder ke item dalam workout list (String work) dan menambah enter workoutsFormatted.append(work).append('\n’); } Workouts.setText(workoutsFormatted); } ---WorkoutExpert.java--- Import java.util.List; Public class WorkoutExpert { List <String> getWorkouts(String workoutTypes){ List <String> workout = new ArrayList<String>(); If(workoutTypes.equals(“Chest”)){ Workout.add(“Bench Press”); Workout.add(“Cable Flys”); }else if (workouttypes.equals(“Triseps”)){ Workout.add(“Triceps ext”); Workout.add(“triceps pushdowns”); }else if(workouttypes.equals(“Shoulder”){ Workout.add(“shoulder press”); }else if (workouttypes.equals(“Byceps”)){ Workout.add(“Bycep curls”); } Return workout; }} cara run aplikasi di device build, build APK, notif build apk, klik link show in Explorer, ada file dan harus di send ke device overflow menu (api 21) apa yang akan terjadi jika menekan 3 titik di ujung activity bagian atas RelativeLayout, properties, id main_view Menu, menu_main.xml ---strings.xml--- <string name=”blqblabla”>blabla</string> <string name=”red_string”>red</string> <string name=”blue_string”>blue</string> <string name=”green_string”>green</string> ---menu_main.xml--- <menu blablabla> //membuat group item dan jika terdapat beberapa pilihan, kita bisa memilih 1 option <group android:checkableBehavior =”single”> <item Android:id=”@+id/menu_red” //akan tampil pertama dalam menu Android:orderInCategory=”1” App:showAsAction=”never” Android:title=”@string/red_string” /> <item Android:id=”@+id/menu_blue” //akan tampil kedua dalam menu Android:orderInCategory=”2” App:showAsAction=”never” Android:title=”@string/blue_string” /> <item Android:id=”@+id/menu_green” //akan tampil kedua dalam menu Android:orderInCategory=”3” App:showAsAction=”never” Android:title=”@string/green_string” /> </group> </menu> ---MainActivity.java--- //code di dalam onCreate setelah setContentView dihapus --onCreate—{} --onCreateOptionMenu—{} @Override Public boolean onOptionsItemSelected (MenuItem item){ RelativeLayout main_view = (RelativeLayout)findViewById(R.id.main_view); Switch(item.getItemId()){ Case R.id.menu_red: If(item.isChecked()) Item.setChecked(false); Else Item.setChecked(true); main_view.setBackgroundColor(Color.RED); return true; Case R.id.menu_blue: If(item.isChecked()) Item.setChecked(false); Else Item.setChecked(true); main_view.setBackgroundColor(Color.BLUE); return true; Case R.id.menu_green: If(item.isChecked()) Item.setChecked(false); Else Item.setChecked(true); main_view.setBackgroundColor(Color.GREEN); return true; default:return super.onOptionsItemSelected(item); }}} Manifest, AndroidManifest.xml, show line numbers, 14th line, hapus NoActionBar, run app animations & transitions (API 21) RelativeLayout, properties, id myLayout Tambahkan Button, properties, id myButton ---MainActivity.java--- ViewGroup myLayout; --onCreate-- myLayout = (ViewGroup) findViewById(R.id.myLayout); myLayout.setOnTouchListener( new RelativeLayout.OnTouchListener(){ public boolean onTouch (View v, MotionEvent event){ moveButton(); return true; }}) Public void moveButton(){ //membuat animasi (proses gerakan button saat ditekan) TransitionManager.beginDelayTransition(myLayout); View myButton = findViewById(R.id.myButton); RelativeLayout.LayoutParams positionRules = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT ); //menambahkan transitions agar button bisa pindah ke bawah positionRules.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TR UE); myButton.setLayoutParams(positionRules); //code untuk menambahkan transition button bisa menjadi lebih besar ViewGroup.LayoutParams sizeRules = myButton.getLayoutParams(); sizeRules.width=450; sizeRules.height=300; myButton.setLayoutParams(sizeRules); } Hasil ketika klik layout, button akan pindah kebawah dan ukurannya akan membesar dengan animasi intent (api 15) jika mengeklik sesuatu di sebuah activity, activity lain akan muncul. RelativeLayout, Properties, background #009900 (random number) hasilnya hijau, id FirstText Tambahkan LargeText, properties, text First Activity Tambahkan Button, properties, id FirstButton ---content_main.xml--- <TextView Blablabla /> <Button Blablabla Android:onClick=”onClick” /> App folder, java, com.blabla, new, activity, blank activity, jangan centang Launcher Activity dan Use as a Fragment, name content_activity_two.xml RelativeLayout di content_activity_two.xml, properties, background #006699 (background menjadi biru) Tambahkan large text, properties, text Second Activity, id SecondText Tambahkan button, properties, id SecondButton, onClick onclick2 (cara untuk membuat onClick selain menggunakan xml) Tambahkan PlainText, properties, width 250dp, id firstInput ---MainActivity.java--- --onCreate—{} Public void onClick(View view){ //tekan alt+enter untuk mengimpor intent dsb //membuat intent dengan parameter (this, class yang akan muncul jika button diklik) Intent i = new Intent(this,ActivityTwo.class); //membuat referensi dari PlainText firstInput Final EditText firstInput = (EditText) findViewById (R.id.firstInput); //mendapatkan text dari user di firstInput dan mengkonversi ke string String userMessage = firstInput.getText().toString(); //pass on the message ke activity kedua menggunakan intent (“namaMessage”, text yang akan dipindahkan ke activity kedua) i.putExtra(“firstMessage”,userMessage); startActivity(i); } ----ActivityTwo.java--- --onCreate— Bundle firstData = getIntent().getExtras(); //print message yang akan dipindahkan ke activity kedua //jika user tidak memasukkan apa-apa maka tdk akan keluar apa apa If(firstData == null){ Return; } //mendapatkan message dari activity pertama dan disimpan kedalam string String firstMessage = firstData.getString(“firstMessage”); //mendapatkan referensi dari text yang ada di activity kedua Final TextView secondText = (TextView) findViewById(R.id.SecondText); //mengubah text di activity kedua menjadi text yang telah dimasukkan user di activity pertama secondText.setText(firstMessage); hasil di activity pertama ada text yang berbunyi First Activity dan ada input user yang bila ada input yang dimasukkan dan ditekan tombol dibawahnya akan membuka activity kedua dan hasil input yang telah diketik ditunjukkan disana cara mengirim Broadcast Intents (api 15) mengirim message broadcast dari 1 app ke app lain ----SendBroadcast app---- Tambahkan Button, properties, text Send Broadcast, id sendButton, onClick sendOutBroadcast ---MainActivity.java--- --onCreate—{} Public void sendOutBroadcast (View view){ Intent i = new Intent (); //melakukan intent dari aplikasi ini (nama app com.username.namaAplikasi) bisa dilihat di paling atas kiri i.setAction(“com.example.SendBroadcast”); i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); sendBroadcast(i); } ----RecieveBroadcast app---- No activity App folder, java, klik kanan com.example.blablabla, new, other, broadcast receiver, centang kedua checkbox, finish ---myReceiver.java--- --onReceive-- hapus semua code di dalamnya //LENGTH_LONG merupakan durasi broadcast yg berati durasinya lama, broadcast received merupakan message nya Toast.makeText(context,”Broadcast Received”, Toast.LENGTH_LONG).show(); Manifest folder, AndroidManifest.xml ---AndroidManifest.xml--- --di dalam <receiver/>-- //membuat intent filter (android:name = nama app yang mengirim broadcast) <intent-filter> <action android:name=”com.example.application.sendBroadcast”> </action> </intent-filter> Run receiveBroadcast app lalu run sendBroadcast app, tekan tombol send broadcast maka akan muncul message broadcast received threads (biasanya untuk game) (??) urutan eksekusi kode dari atas ke bawah tambahkan LargeText, properties, text hello, id myText tambahkan Button, properties, text click me, id myButton, onClick ClickMyButton ---MainActivity.java--- //import android.os.Handler; import android.os.Message; //handler merupakan main thread yang akan dieksekusi Handler handler = new Handler (){ //override method handleMassage Public void handleMessage(Message mag){ //kode dibawah tidak boleh dimasukkan dalam runnable karena harus dieksekusi di depan TextView myText = (TextView) findViewById(R.id.myText); myText.setText(“Button Clicked”); }} --onCreate—{} Public void ClickMyButton(View view){ //membuat runnable (kode yang akan dieksekusi di background/belakang atau thread lain) Runnable r = new Runnable(){ @override Publuc void run(){ //menambahkan delay 10 detik (10000 miliseconds) setelah button diklik Long futureTime = System.currentTimeMillis()+10000; While (System.currentTimeMillis()<futureTime){ //synchronized digunakan untuk mencegah beberapa threads bertubrukan dengan satu sama lain Synchronized (this){ Try{ Wait(futureTime-System.currentTimeMillis()); } Catch (Exception e){ }} //memanggil handler Handler.sendEmptyMessage(0); }}; //membuat dan memulai thread (nama runnable interface) Thread myThread = new Thread(r); myThread.start(); } }}; Hasil ada text hello dan sebuah button dan jika button diklik maka setelah 10 detik, text akan berubah menjadi Button Clicked tetapi jika button diklik terus menerus maka aplikasi akan crash namun jika ada thread handler, app tidak akan crash intent service (??) proses yang dijalankan di background dan user tidak akan melihat atau berinteraksi dengannya (contoh = kode untuk mendengarkan adanya message yang datang dan memberi notifikasi dalam message app) app folder, java,com.blabla, new, java class, nama MyIntentService ---MyIntentService.java--- Public class MyIntentService extends IntentService{ //membuat tag menggunakan “package name” Private static final String TAG = “com.blablabla”; //alt+insert, constructor, tidak menggunakan parameter karena merupakan constructor Public MyIntentService() Super(“MyIntentService”); { //alt+insert, override methods, onHandleIntent @Override Protected void onHandleIntent(Intent intent){ Log.i(TAG,”The service has started”); }} ---AndroidManifest.xml--- //diantara activity dan app tag <service android:name=”.MyIntentService”/> RelativeLayout, Properties, background #009900 (random number) hasilnya hijau, id FirstText Tambahkan LargeText, properties, text First Activity Tambahkan Button, properties, id FirstButton ---content_main.xml--- <TextView Blablabla /> <Button Blablabla Android:onClick=”onClick” /> App folder, java, com.blabla, new, activity, blank activity, jangan centang Launcher Activity dan Use as a Fragment, name content_activity_two.xml RelativeLayout di content_activity_two.xml, properties, background #006699 (background menjadi biru) Tambahkan large text, properties, text Second Activity, id SecondText Tambahkan button, properties, id SecondButton, onClick onclick2 (cara untuk membuat onClick selain menggunakan xml) Tambahkan PlainText, properties, width 250dp, id firstInput ---MainActivity.java--- --onCreate—{ Intent intent = new Intent(this, MyIntentService.class); startService(intent); Intent i = new Intent(this, MyService.class); startService(i); Public void onClick(View view){ //tekan alt+enter untuk mengimpor intent dsb //membuat referensi dari PlainText firstInput Final EditText firstInput = (EditText) findViewById (R.id.firstInput); //mendapatkan text dari user di firstInput dan mengkonversi ke string String userMessage = firstInput.getText().toString(); //pass on the message ke activity kedua menggunakan intent (“namaMessage”, text yang akan dipindahkan ke activity kedua) i.putExtra(“firstMessage”,userMessage); startActivity(i); } ----ActivityTwo.java--- --onCreate— Bundle firstData = getIntent().getExtras(); //print message yang akan dipindahkan ke activity kedua //jika user tidak memasukkan apa-apa maka tdk akan keluar apa apa If(firstData == null){ Return; } //mendapatkan message dari activity pertama dan disimpan kedalam string String firstMessage = firstData.getString(“firstMessage”); //mendapatkan referensi dari text yang ada di activity kedua Final TextView secondText = (TextView) findViewById(R.id.SecondText); //mengubah text di activity kedua menjadi text yang telah dimasukkan user di activity pertama secondText.setText(firstMessage); java folder, new, service, service, nama MyService, centang kedua box ---MyService.java--- //Menambahkan tag message Private static final String TAG = “com.blabla”; //membuat constructor Public MyService(){ } //alt+insert, override methods, onStartCommand, onDestroy, ok //onStartCommand method untuk menjalankan kode yang ada di dalamnya sebagai service @Override Public int onStartCommand(Intent intent, int flags, int startId){ Log.i(TAG,”OnStart called”); //membuat thread baru Runnable r = new Runnable(){ @override Public void run(){ For (int i = 0; i<5,i++){ Long futureTime = System.currentTimeMillis()+5000; While(System.currentTimeMillis()<futureTime){ Synchronized(this){ Try{ Wait(futureTime-System.currentTimeMillis()) Log.i(TAG,”Service is running”); }catch (Exception e){ }}}}}}; Thread myThread = new Thread(r); myThread.start(); //run service lagi saat service crash return Service.START_STICKY; } //onDestroy untuk menjalankan kode di dalamnya saat service di destroy atau berakhir @Override Publuc void onDestroy(){ Log.i(TAG,”onDestroy called”); } Hasil message dari service akan ada di log Bound service service yang berhubungan dengan app, misal kalau app mati service juga mati Tambahkan LargeText, id myText Tambahkan Button, id myButton, onClick showTime Java.com.blabla, new, service, MyService, centang box ---MyService.java--- Private final IBinder myBinder = new MyLocalBinder(); Public MyService(){ } Public class MyLocalBinder extends Binder{ MyService getService(){ Return myService.this; }} Public String getCurrentTime(){ //mendapatkan waktu saat ini (jam:menit:detik) SimpleDateFormat df = new SimpleDateFormat(“HH:mm:ss”, Locale.US); Return (df.format(new Date())); } @Override Public IBinder onBind(Intent intent){ Return myBinder; } ---MainActivity.java--- Import blabla Import com.blabla (package name).MyService.MyLocalBinder; --class MainActivity— MyService myService; Boolean isBound = false; Publuc void showTime(View view){ String currentTime = myService.getCurrentTime(); TextView myText = (TextView) findViewById(R.id.myText); myText.setText(currentTime); } --onCreate{}— Intent i = new Intent(this, MyService.class); //harus ditambahkan saat membuat bound service bindService(i,myConnection, Context.BIND_AUTO_CREATE); --onCreateOption{}— --onOptiomsItemSelected{}— Private ServiceConnection myConnection = new ServiceConnection(){ //kode yang akan dieksekusi saat service tersambung @Override Public void onServiceConnected(ComponentName name,IBinder service){ MyLocalBinder binder = (MyLocalBinder) service; myService = binder.getService(); isBound = true; } //kode yang akan dieksekusi saat service disconnected @Override Public void onServiceDisconnected(ComponentName name){ isBound = false; }}} Hasil –> ada TextView dan Button, jika Button diklik maka TextView akan berubah menjadi waktu saat ini List View menampilkan sesuatu dalam sebuah list copy paste image yang akan ditampilkan di drawable ---content_main.xml--- <ListView Android:layout_width=”match_parent” Android:layout_height=”match_parent”> </ListView> Design, ListView, properties, id myListView //akan ada sebuah ListView yang didalamnya ada tulisan item 1, subitem, item 2, dst ---MainActivity.java--- --class MainActivity extends Activity— --onCreate— String[] fruits = (“Apple”,”Orange”,”peach”,”mango”); //untuk menyambungkan string array dan ListView di activity dibutuhkan ListAdaptor (new tipedata yang akan disambungkan +Adaptor<tipedata item>(this ,jenis layout, nama array yang akan disambungkan)) ListAdapter myAdapter = new CustomAdapter(this,fruits); //setAdapter untuk mengubah isi ListView menjadi myAdapter(array fruits) myListView.setAdapter(myAdapter); //action listener myListView.setOnItemClickListener( new AdapterView.OnItemClickListener(){ @Override Public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //mendapatkan item dalam ListView dan memasukkannya dalam sebuah String String fruit = String.valueOf(parent.getItemAtPosition(position)); //menampilkan di activity menggunakan Toast Toast.makeText(MainActivity.this, fruit, Toast.LENGTH_LONG).show(); }}};} Klik kanan layout, new, layout resource file, file name custom_row, root element LinearLayout,ok ---custom_row.xml--- --<LinearLayout--- Android:orientation=”horizontal” > </LinearLayout> Tambahkan ImageView ke LinearLayout (geret ImageView ke component tree LinearLayout di samping kanan) //src merupakan source image yg dalam kasus ini terletak dalam drawable folder dan bernama fruit.png imageView, properties, src @drawable/fruit, layout:width 80dp, layout:weight 80dp, layout:margin, all 5dp, id myImage tambahkan Large Text, properties, layout:margin, all 5dp, id myText app folder, java, klik kanan com.blabla, new, Java Class, nama CustomAdapter,ok ---CustomAdapter.java--- Class CustomAdapter extends ArrayAdapter<String>{ //alt+insert, constructor, ArrayAdapter yg plg atas punya 2 parameter, ok Public CustomAdapter(Context context, String[] fruits){ Super(context, R.layout.custom_row, fruits); } //alt+insert, override methods, getView,ok (membuat custom adaptor dan menyesuaikannya dengan array fruits @Override Public View getView(int position, View convertView, ViewGroup parent){ //mendapat referensi dari ListView yang ada di activity LayoutInflater myInflater = LayoutInflater.from(getContext()); View CustomView = myInflater.inflate(R.layout.custom_row,parent,false); //mendapatkan referensi item tergantung dari posisinya String singleFruitItem = getItem(position); //mendapatkan referensi dari TextView dan Image TextView myText = (TextView) CustomView.findViewById(R.id.myText); ImageView myImage = (ImageView) CustomView.findViewById(R.id.myImage); myText.setText(singleFruitItem); myImage.setImageResource(R.drawable.fruit); Return CustomView; }} Hasil ada ListView yang berisi buah buahan dari string fruits dan jika item di ListView ditekan maka akan menampilkan message yang isinya item tsb, setuap item memiliki gambar dari drawable Cara save data menggunakan SQLite save data yang dimasukkan semua user yg nantinya bisa diakses (contoh : barang2 yg dijual di online shop) Tambahkan PlainText, properties, layout:width 300dp, id myInput Tambahkan Button, properties, text add, id addButton, onClick addButtonClick Tambahkan Button, properties, text delete, id deleteButtin, onClick deleteButtonClick Tambahkan LargeText, properties, id myText App folder, klik kanan com.blabla, new, java class, nama Products, ok ---Products.java---