free counters
Diberdayakan oleh Blogger.
Tampilkan postingan dengan label pemrograman. Tampilkan semua postingan
Tampilkan postingan dengan label pemrograman. Tampilkan semua postingan

Senin, 29 Februari 2016

Link yang dapat diklik dari String untuk TextView Android

by Unknown  |  in pemrograman visual at  Senin, Februari 29, 2016


Contoh project dari artikel ini dapat di download Di sini.

Ada beberapa cara tersembunyi yang dapat kita pakai untuk membuat link url dalam sebuah string bekerja di AppCompatTextView pada Android.

Saya menemukan bahwa di custom view (sejujurnya, saya masih mencoba dengan Material Dialogs), sebuah string dengan url hanya bekerja jika kita menggunakan setMovementMethod untuk TextView


Pada Custom View

Jika kita ingin sebuah string yang mengandung url dan kode html di custom view seperti ini:
 Created by <b>Joielechong</b> (<a href="http://www.rilixtech.com">rilixtech.com</a>)  
Dengan TextView di layout seperti file xml di bawah ini:
1:  <?xml version="1.0" encoding="utf-8"?>  
2:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3:    android:id="@+id/sample_layout"  
4:    android:layout_width="match_parent"  
5:    android:layout_height="match_parent"  
6:    >  
7:    
8:   <android.support.v7.widget.AppCompatTextView  
9:     android:id="@+id/sample_layout_title"  
10:     android:layout_width="wrap_content"  
11:     android:layout_height="wrap_content"  
12:     android:textSize="18sp"  
13:     />  
14:  </RelativeLayout>  
Kita tidak akan bisa membuatnya bekerja jika menggunakan attribut android:autoLink="all" atau android:linksClickable="true". Jadi, kode di bawah ini Tidak Akan Bekerja:
1:  <?xml version="1.0" encoding="utf-8"?>  
2:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3:    android:id="@+id/sample_layout"  
4:    android:layout_width="match_parent"  
5:    android:layout_height="match_parent"  
6:    >  
7:    
8:   <android.support.v7.widget.AppCompatTextView  
9:     android:id="@+id/sample_layout_title"  
10:     android:layout_width="wrap_content"  
11:     android:layout_height="wrap_content"  
12:     android:text="@string/test_string_1"  
13:     android:textSize="18sp"  
14:     android:autoLink="all"  
15:     android:linksClickable="true"  
16:     />  
17:    
18:  </RelativeLayout>  
Untuk membuatnya bekerja, kita harus menambahkan baris berikut pada kelas:
 textView.setMovementMethod(LinkMovementMethod.getInstance());  
Jangan lupa untuk menghapus attribut android:autoLink="all" di layout xml karena attribut ini akan menyebabkan kode di atas tidak berfungsi sama sekali.


Pada Normal View

Jika kita menggunakan setMovementMethod untuk TextView tanpa menggunakan attribut android:autoLink="all" di layout, link url akan bekerja. Link url juga akan bekerja jika kita hanya menggunakan android:autolink="all". Tetapi jika kita hanya menggunakan attribut android:linksClickable="true" maka link url tidak akan bekerja sama sekali.

Download project artikel ini  Di sini.

Referensi:
How do I make links in a TextView clickable?
I want text view as a clickable link
Android: textview hyperlink
Make a hyperlink textview in android
How to make normal links in TextView clickable?

Clickable Link In String for TextView Android

by Unknown  |  in pemrograman visual at  Senin, Februari 29, 2016


You can download the working example for this tutorial in Here.

There are some hidden quirk that could be use to make an url link in string working in AppCompatTextView in android.

I found that in custom view (honestly, I just trying it with Material Dialogs), a string with an url only work if we use setMovementMethod for TextView


In Custom View

If we want a string containing an url and html code in custom view like this:
 Created by <b>Joielechong</b> (<a href="http://www.rilixtech.com">rilixtech.com</a>)  
For a TextView in a layout like the following xml file:
1:  <?xml version="1.0" encoding="utf-8"?>  
2:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3:    android:id="@+id/sample_layout"  
4:    android:layout_width="match_parent"  
5:    android:layout_height="match_parent"  
6:    >  
7:    
8:   <android.support.v7.widget.AppCompatTextView  
9:     android:id="@+id/sample_layout_title"  
10:     android:layout_width="wrap_content"  
11:     android:layout_height="wrap_content"  
12:     android:textSize="18sp"  
13:     />  
14:  </RelativeLayout>  
We can't make it work by using either android:autoLink="all" or android:linksClickable="true". So the following code Won't work:
1:  <?xml version="1.0" encoding="utf-8"?>  
2:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3:    android:id="@+id/sample_layout"  
4:    android:layout_width="match_parent"  
5:    android:layout_height="match_parent"  
6:    >  
7:    
8:   <android.support.v7.widget.AppCompatTextView  
9:     android:id="@+id/sample_layout_title"  
10:     android:layout_width="wrap_content"  
11:     android:layout_height="wrap_content"  
12:     android:text="@string/test_string_1"  
13:     android:textSize="18sp"  
14:     android:autoLink="all"  
15:     android:linksClickable="true"  
16:     />  
17:    
18:  </RelativeLayout>  
To make it work, we must add a line of code in our working class below:
 textView.setMovementMethod(LinkMovementMethod.getInstance());  
Remember to remove android:autoLink="all" in your layout xml because it render the above code useless.


In Normal View

If we use setMovementMethod for TextView and without android:autoLink="all" attribute in layout, url link will be enabled. Using only android:autolink="all" will also working. By using only android:linksClickable="true" url link will not working at all.

Download the working project Here.


Reference:
How do I make links in a TextView clickable?
I want text view as a clickable link
Android: textview hyperlink
Make a hyperlink textview in android
How to make normal links in TextView clickable?

Kamis, 18 Februari 2016

Memulai belajar pemrograman

by Unknown  |  in pemrograman at  Kamis, Februari 18, 2016

Saya sering menemukan bahwa kebanyakan orang yang belajar pemrograman tidak tahu apa tujuannya belajar pemrograman. Kebanyakan malah cuma tahu belajar pemrograman yah cuma untuk buat program. Nah ini yang membuat kebanyakan pemula tidak pernah naik ke tingkat yang lebih mahir atau menjadi programmer handal.

Kalau mengingat kembali waktu saya masih memulai belajar pemrograman, saya sama sekali tidak tahu apa gunanya. Saya cuma tahu pemrograman itu bahasa komputer dan mata kuliah yang harus saya ambil jika ingin lulus kuliah. Motivasi seperti ini sama sekali tidak membantu perkembangan pengetahuan programming saya.

Sama seperti musafir yang tidak punya tujuan, seorang programmer pemula tidak akan menjadi programmer yang handal jika tidak punya tujuan yang jelas. Kita harus punya tujuan yang jelas untuk belajar. Jadi apa sebenarnya tujuan kita untuk belajar pemrograman?

Tujuan belajar pemrograman tidak perlu sesuatu yang wah. Bahkan tujuan sederhana seperti membuat aplikasi pemutar lagu buatan sendiri pun sudah cukup tepat dijadikan alasan untuk mendalami bahasa pemrograman. Karena dengan adanya tujuan tersebut, kita tahu apa yang ingin kita capai. Kita tahu apa yang harus kita kerjakan dan pelajari untuk membuat aplikasi tersebut.

Struktur Data dan Algoritma

Rata-rata orang yang memulai belajar struktur data dan algoritma (sepanjang artikel ini saya akan menggunakan singkatan SDA untuk ini) akan mengalami banyak kesulitan jika tidak tahu apa tujuan belajar SDA. Ditambah lagi kalau mereka sama sekali belum pernah belajar dasar pemrograman. Menurut saya SDA itu merupakan bahan pelajaran tingkat menengah yang sama sekali belum cocok untuk dipelajari orang-orang yang baru memulai pemrograman. Di dalam SDA, pelajar dianggap telah mengetahui dan mengenal hampir semua dasar pemrograman karena disitu tercakup semua segi dasar pemrograman.

Masalah yang juga cukup sering muncul saat seseorang belajar SDA adalah ia tidak cukup paham untuk apa struktur data dan untuk apa algoritma tersebut digunakan. Jadi seperti masalah yang saya terangkan di bagian awal artikel ini, kita tidak tahu atau kurang tahu apa tujuan pembelajaran tersebut.

Struktur data umumnya ditujukan untuk mengefesienkan kinerja dari kode pemrograman yang telah kita buat. Ini merupakan proses tingkat lanjut yang kita lakukan jika kita ingin membuat kode pemrograman yang lebih baik. Jadi untuk yang baru belajar pemrograman, struktur data bukan hal yang mendesak untuk dipelajari.

Algoritma adalah bagaimana langkah-langkah yang dilakukan yang terkandung di dalam kode pemrograman. Contoh algoritma sederhana dapat kita temukan saat kita memasak nasi goreng (kalau belum pernah masak nasi goreng sendiri, tolong dipelajari juga...:P). Kita perlu menentukan langkah-langkah yang kita perlukan dalam memasaknya, seperti berikut:
  1. Sediakan nasi
  2. Sediakan minyak
  3. Sediakan wajan untuk memasaknya
  4. Sediakan bumbu-bumbunya
  5. Nyalakan kompor dan letakkan wajan dengan minyak di atasnya
  6. masukkan nasi ke wajan
  7. Masukkan bumbu-bumbunya
  8. Goreng sampai nasi menjadi kekuning-kuningan
  9. Hidangkan.
  10. Selesai
Cukup sederhana bukan?. Nah seperti itu juga di dalam pemrograman. Kita perlu menentukan algoritma yang tepat agar program kita berjalan dengan baik.


Kesimpulannya adalah:
Tentukan tujuanmu yang spesifik dalam belajar pemrograman


Selamat memprogram ria...;)


sumber gambar: Computer programming

Rabu, 27 Januari 2016

Custom view With Multiple Value Using Flags attributes on Android

by Unknown  |  in pemrograman at  Rabu, Januari 27, 2016
Most standard Android UI views give us very general usage than can be used in many tasks and many situations. But in some apps we need to be able to customize those standard views to suit our own needs.

We can customizing standard view to create our custom views by extending View or an existing subclass. There are generally 3 three steps to create our custom view:
   1. Extend View by subclassing
   2. Define custom attributes
   3. Add logic based on the attributes

In this article, we will extending TextView to create our custom view. The Custom view, which we called CustomTextView, will be a simple TextView with prefix and suffix. The prefix can be bolded, italized, large, or the combination of those three attributes. We will achieve like picture below:



To have a combination of attribute value, we must use attribute with flags. More on this later.



Extend View by Subclassing

Because we extending TextView we must create our own class, CustomTextView, like this:
  public class CustomTextView extends TextView {  
   public CustomTextview(Context context, AttributeSet attrs) {  
    super(context, attrs);  
   }  
  }  
TextView has many different constructors, but for most purpose it's sufficient to implement just one like the code above. Also for the shake of simplicity of the article, I don't show the rest of the code.

Define Custom Attributes

Our custom view will have attribute to set prefix, suffix, and the text style of suffix. There are 3 text style for prefix: Bold, Italic, and Large. So we need to create three attributes for them like this:
1:  <resources>  
2:    <declare-styleable name="CustomTextView">  
3:     <attr format="string" name="ct_prefix">  
4:     <attr format="string" name="ct_suffix">  
5:     <attr name="ct_prefix_style">  
6:       <flag name="Bold" value="1">  
7:       <flag name="Italic" value="2">  
8:       <flag name="Large" value="4">  
9:     </flag></flag></flag></attr>  
10:    </attr></attr></declare-styleable>  
11:   </resources>  
We use flags because it is the only attribute types that allow us to combine multiple value. It's like when we use android:textStyle, where we can define text as both bold and italic value with android:textStyle="bold|italic". Read more at Android: Custom XML attributes and views .

Maybe you a little confused by the flags values. We use values of 1, 2, and 4 for Bold, Italic, and Large names respectively because it is easier working with when OR-ing them. Those values; 1, 2, and 4 are decimal values from binary values. Please look at the table below:

Decimal Binary
1 0001
2 0010
4 0100

So when OR-ing them like Bold|Italic (Bold = 1, Italic = 2), we will get the value of 3 which is 0011 in decimal. The effect is, we can't lose our flags value!


Add logic Based On The Attributes

To access the attributes from code, we must get the attributes by using obtainStyledAttributes() method like the following code:
 final TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.CustomTextView, defStyleAttr, defStyleRes);  

Then we can get each attribute by using the attributes object, like this:
 final CharSequence prefix = attributes.getText(R.styleable.CustomTextView_ct_prefix);  
 final CharSequence suffix = attributes.getText(R.styleable.CustomTextView_ct_suffix);  
 prefixStyle = attributes.getInteger(R.styleable.CustomTextView_ct_prefix_style, 0);  
Remember to give back resource to system by recycle th attributes:
 attributes.recycle();  

After we have all the value from attributes, we do the work based on the value. Here we will work with ct_prefix_style because it's more difficult than other.

Because we working with the chance of combined value from ct_prefix_style flags, we handle it by AND-ing it to get the value.

For everyone who don't remember what is AND-ing, I try to explain it with AND table below, where x is AND-ed with y:

X Y Result
0 0 0
0 1 0
1 0 0
1 1 1

every value AND-ed with 0 will be 0, and only value 1 AND-end with 1 will be 1.

Back to main story. We AND-ing the ct_prefix_style attribute value with each flag value like below:
  if((prefixStyle & PrefixStyle.BOLD) == PrefixStyle.BOLD) {  
   spannableString.setSpan(new TextAppearanceSpan(getContext(), R.style.Bold), 0, prefix.length(), 0);  
  }  
  if((prefixStyle & PrefixStyle.ITALIC) == PrefixStyle.ITALIC) {  
   spannableString.setSpan(new TextAppearanceSpan(getContext(), R.style.Italic), 0, prefix.length(), 0);  
  }  
  if((prefixStyle & PrefixStyle.LARGE) == PrefixStyle.LARGE) {  
   spannableString.setSpan(new TextAppearanceSpan(getContext(), R.style.Large), 0, prefix.length(), 0);  
  }  

where the PrefixStyle variables are from PrefixStyle class:
1:   public class PrefixStyle {  
2:    public static final int BOLD = 1;  
3:    public static final int ITALIC = 2;  
4:    public static final int LARGE = 4;  
5:   }  
Here the prefixStyle is AND-ed to check if flag attribute is used or not.

Then we can apply the style to the text.

To use our CustomTextView, we just add the xml code like below:
1:  <io.github.joielechong.CustomTextView  
2:    android:layout_centerHorizontal="true"  
3:    android:text="10000"  
4:    android:layout_width="wrap_content"  
5:    android:layout_height="wrap_content"  
6:    custom:ct_prefix="$"  
7:    android:textSize="24sp"  
8:    custom:ct_suffix="-"  
9:    custom:ct_prefix_style="Bold|Italic"  
10:  />  

Don't forget to add the following code at your root layout:
 xmlns:custom="http://schemas.android.com/apk/res-auto"  


For the complete library and example source code, you can get at CustomTextView in my github.

Every critiques, suggestions, and correction are really appreciated.

Selasa, 26 Januari 2016

Menggunakan Array pada Java

by Unknown  |  in pemrograman at  Selasa, Januari 26, 2016
Saya sering berurusan dengan array waktu coding memakai bahasa Java, tapi sering sekali saya lupa mempergunakan array. Malah saya lebih sering mempergunakan ArrayList karena kemudahannya walau sebenarnya ArrayList jauh lebih boros penggunaan memori daripada array.

Hal yang membuat saya sering memilih ArrayList daripada array primitif karena dalam pikiran saya tertanam pendapat bahwa array harus dideklarasikan bersama dengan ukurannya. Contohnya, jika kita ingin membuat array dari int dengan ukuran 10, maka kita harus menuliskan kode program berikut ini:
 int[] arrayInt = new int[10];  
Ternyata saya salah!



Rupanya kita bisa juga mendeklarasikan array tanpa perlu menetapkan ukurannya seperti ini:
 int[] arrayInt;  
Lalu saat konfigurasi, kita bisa menetapkan ukurannya seperti ini:
 arrayInt = new int[10];  
Selain itu, kita juga bisa menentukan nilai dan ukuran dari array secara langsung seperti ini:
 int[] arrayInt = {1,2,3};  
Jadi kesimpulannya kita bisa menentukan array primitif seperti kode di bawah ini:
 int[] arrayInt = new int[3];  
 int[] arrayInt = {1,2,3};  
 int[] arrayInt = new int[]{1,2,3};  
Dan untuk array dari kelas, seperti String, sama saja:
 String[] arrayString = new String[3];  
 String[] arrayString = {"a","b","c"};  
 String[] arrayString = new String[]{"a","b","c"};  


Penggunaannya
Untuk contoh penggunaannya array dalam program dapat dilihat dari kode di bawah ini:

Selamat berprogramming ria...;)



sumber gambar: https://en.wikipedia.org/wiki/Java_(programming_language)

Kamis, 07 Januari 2016

Koma atau titik, Hal yang sepelekah?

by Unknown  |  in pemrograman at  Kamis, Januari 07, 2016

Sebagai programmer saya beberapa kali berhadapan dengan error yang disebabkan karena salah memasukkan tanda baca, seharusnya titik (.) malah terketik koma (,). Sepele kelihatannya tapi terlalu besar efeknya. Kesalahan tersebut pernah menyebabkan saya kehilangan waktu selama 2 hari untuk mencari penyebab mengapa kode yang saya buat tidak bekerja.

Sama halnya dengan kehidupan sehari-hari, kita sering mengabaikan hal-hal yang sepele dalam hidup. Padahal hal-hal yang sepelelah yang sering menjadi biang kerok akan sulitnya hidup. Kita merasa sepele dengan tindakan-tindakan kecil yang kita lakukan sehari-hari. Tindakan kecil ini kita abaikan. Hari demi hari berlalu, bulan demi bulan berlalu tindakan kecil tersebut kemudian menjadi bagian hidup kita dan menjadi kebiasaan kita. Seperti sebuah perkataan bijak yang pernah saya baca, "Tindakan membentuk kebiasaan, kebiasaan membentuk sifat, sifat membentuk karakter, karakter membentuk hidup kita". Kita harus lebih perhatian terhadap hal-hal yang kecil dan yang kelihatan seperti sepele.

Selesaikan hal sepele dengan baik. Jangan pernah merasa bahwa hal-hal kecil tidak berguna. Tetapi berprinsiplah bahwa segala hal itu penting bagi perkembangan hidup kita.





Sumber gambar: How to stop being scared of full stops

Sabtu, 10 Oktober 2015

Membuat Game Online Android

by Unknown  |  in pemrograman at  Sabtu, Oktober 10, 2015

Ternyata banyak hal yang perlu dipersiapkan untuk mengembangkan Game online untuk Android. Baik dari segi finansial, kejiwaan, serta teknisnya. Secara finansial, kalau gak punya uang yang gak bisa makan. Jadi kalau gak makan kan gak mungkin bisa membuat game, ya kan? hahaha. Secara kejiwaan, kalau jiwa gak kuat bakalan cepat stress mengerjakannya, dan bisa jadi gagal membuat gamenya. Jadi harus dipastikan seorang pembuat game harus tidak mengalami gangguan kejiwaan.

Karena secara finansial saya masih bisa makan dan secara kejiwaan saya masih normal, maka hal yang perlu dikaji sekarang adalah hal teknisnya.

Dalam mengembangkan game online untuk Android adalah beberapa hal yang perlu dikuasai:

1. Jenis Game
Kita harus mengerti jenis game apa yang kita kembangkan, apakah game turn base, atau game MMORPG yang melibatkan banyak pemain sekaligus, atau game First-Person Shooter yang membutuhkan tingkat akurasi game.

2. Server Game
Bagi masing-masing game dibutuhkan jenis server yang berbeda. Untuk first person shooter, server membutuhkan tingkat akurasi yang tinggi. Untuk game MMORPG, server membutuhkan kemampuan untuk melayani banyak pengguna sekaligus, yang mungkin sampai 100.000 pengguna secara bersamaan seperti Game Clash Of Clans. Beberapa open source game server ini patut dicoba: gamemachine, KBEngine, dan Nugetta.

3. Game Engine
Dibutuhkan Game Engine untuk memudahkan kita membuat game. Tentu saja kita bisa mengembangkan sendiri game dari dasar, tetapi hal tersebut akan menghabiskan waktu. Ini beberapa Game Engine yang dapat dipakai: LibGDX, Unity3D, OGRE, Cocos2d-x.

Nah, ketiga hal inilah yang perlu kita kuasai sebelum mengembangkan game. Memang selain ketiga hal tersebut adalah hal terpenting yang sengaja saya tidak cantumkan, yakni Ide. Mengapa saya tidak cantumkan? Karena tidak mungkin mengembangkan game tanpa memiliki ide akan game apa yang ingin dihasilkan bukan?.

Selamat membuat game..:) ;)




sumber gambar: https://en.wikipedia.org/wiki/Game_engine

Rabu, 30 September 2015

Prinsip Dasar Pemrograman Berbasis Objek, STUPID dan SOLID

by Unknown  |  in pemrograman at  Rabu, September 30, 2015
SOLID *
Seumur-umur saya belajar pemrograman, baru saya temukan istilah prinsip STUPID dan SOLID. Kedua istilah ini ternyata bukan hal baru di dalam dunia pemrograman terkhusus pemrograman berbasis objek. Bahkan prinsip SOLID ternyata sudah dimulai pada awal tahun 2000.

Udah lama juga saya berkutat dengan pemrograman berbasis objek, tapi baru istilah DRY, KISS, dan CRUD yang pernah saya dengar. Itupun istilah ini saya tahu dari Dosen saya dulu.

Memang harus saya akui, ini juga salah satu kelemahan mempelajari sesuatu secara otodidak. Kalau gak cocok mood untuk belajar bakalan gak dipelajari, dan sering yang dipelajari yang menurut hati aja yang bakal diperdalam. Tapi tetap gak ada alasan untuk menyalahkan yang lain. Memang harus belajar terus kalau mau berkembang. Ada beberapa referensi yang bisa kita pakai untuk mengetahui prinsip-prinsip tersebut, yakni:

  1. SOLID (Object Oriented Design) dari Wikipedia. (Wikipedia ini wajib dibaca untuk tahu dasarnya) 
  2. S.O.L.I.D: The First 5 Principles of Object Oriented Design
  3. From STUPID to SOLID Code!
  4. Design Principle and Design Pattern oleh Robert C. Martin (Berkas PDF)
  5. The Principles of OOD
Ini jadi bahan pelajaran saya untuk hari ini, semoga dengan pengetahuan baru ini proyek pengembangan aplikasi yang sedang lakukan semakin mudah jalannya. Amin.

Buat teman-teman yang sedang membaca, saya ucapkan selamat!. Yang terutama sih selamat bingung!..wkwkwk :D. Yang kedua, selamat stress!...xixixi 3:). Tetap semangat. Ganbare.



Bagian 1.2, Event Asinkron: Loop Polling dan Interupsi

by Unknown  |  in Pengenalan Pemrograman Menggunakan Java at  Rabu, September 30, 2015
Artikel ini merupakan bagian buku Pengenalan Pemrograman Menggunakan Java


Sebelumnya: Cycle Ambil dan Eksekusi: Bahasa Mesin

Bagian 1.2

Event Asinkron: Loop Polling dan Interupsi


CPU menghabiskan sebagian besar waktunya untuk mengambil instruksi dari memori dan mengeksekusinya. Tetapi CPU dan memori utama hanyalah dua diantara banyak komponen pada sistem komputer nyata. Sistem yang lengkap dari komputer mencakup beberapa perangkat seperti:
  • - Hard disk atau solid state drive untuk menyimpan berkas program dan data. (Perlu diingat bahwa memori utama hanya memegang sejumlah informasi yang relatif kecil dan memegangnya selama sumber daya tetap nyala. Hard disk atau solid state drive digunakan sebagai tempat penyimpanan permanen untuk jumlah informasi yang lebih besar, tetapi program harus dimuat dari disk ke memori utama sebelum program tersebut dieksekusi. Hard disk menyimpan data pada piringan magnetis yang berputar, sedangan solid state drive merupakan perangkat elektronis murni tanpa bagian yang bergerak.)
  • - Keyboard dan mouse untuk masukan pengguna.
  • -Monitor dan printer yang digunakan untuk menampilkan keluaran komputer.
  • - Perangkat keluaran audio yang memungkinan komputer untuk mengeluarkan suara.
  • - Antarmuka jaringan yang memungkinkan komputer untuk berkomunikasi dengan komputer lainnya yang terhubung dengannya pada sebuah jaringan, baik secara nirkabel atau dengan kabel.
  • - Scanner yang mengubah gambar ke kode dalam bilangan biner yang dapat disimpan dan diolah oleh komputer.

Daftar perangkat ini bisa ditambahkan lagi, ini karena sistem komputer dibangun sedemikian rupa sehingga dapat dilakukan penambahan perangkat baru dengan mudah. Terkadang CPU harus berkomunikasi dan mengontrol perangkat-perangkat tersebut. CPU hanya bisa melakukan hal ini dengan mengeksekusi instruksi bahasa mesin (hanya inilah yang bisa dilakukan CPU, titik). Cara kerjanya adalah untuk setiap perangkat di sistem terdapat sebuah driver perangkat, yang terdiri dari perangkat lunak yang akan dieksekusi CPU saat sedang berurusan dengan perangkat tersebut. Pemasangan perangkat baru pada sistem umumnya terdiri dari dari langkah: menghubungkan perangkat secara fisik ke komputer, dan memasang perangkat lunak driver dari perangkat. Tanpa driver dari perangkat, perangkat fisik saja akan tidak berguna, karena CPU tidak akan bisa berkomunikasi dengan perangkat tersebut.


Sebuah sistem komputer yang terdiri dari banyak perangkat biasanya diorganisasikan dengan menggabungkan satu perangkat dengan perangkat lainnya ke satu atau lebih bus. Sebuah bus merupakan sebuah kumpulan kabel yang membawa berbagai macam informasi diantara perangkat-perangkat yang terhubung ke kabel-kabel tersebut. Kabel-kabel ini membawa data, alamat, dan sinyal kontrol. Sebuah alamat akan mengarahkan data ke perangkat tertentu dan kemungkinan ke sebuah register tertentu atau lokasi tertentu dari perangkat tersebut. Sinyal kontrol dapat digunakan , sebagai contoh, oleh sebuah perangkat untuk memberitahukan perangkat lain bahwa data telah tersedia di bus data untuk perangkatnya. Sebuah sistem komputer sederhana dapat di organisasikan sebagai berikut:

Diagram bus dengan perangkat yang terpasang


Saat ini, perangkat seperti keyboard, mouse, dan antarmuka jaringan dapat menghasilkan masukan yang perlu untuk diproses oleh CPU. Bagaiaman CPU mengetahui bahwa data telah ada? ? Salah satu gagasan sederhana, yang tidak memuaskan, adalah CPU tetap memeriksa data yang masuk secara berulang-ulang. Saat CPU menemukan data, ia memproses data tersebut. Metode ini disebut polling, dikarenakan CPU menjajaki perangkat masukan secara berkala untuk mencari tahu apakah perangkat memiliki masukan data untuk dilaporkan. Sayangnya, meskipun polling sangat sederhana, metode ini juga sangat tidak efisien. CPU dapat menghabiskan banyak waktu hanya untuk menunggu masukan.


Untuk menghindari ketidakefisienan ini, interupsi lebih sering digunakan sebagai pengganti polling. Interupsi merupakan sinyal yang dikirimkan oleh perangkat lain ke CPU. CPU merespon sinyal interrupt dengan mengesampingkan apapun yang dilakukannya untuk merespon interupsi tersebut. Setelah CPU telah menangani interupsi tersebut, CPU akan kembali ke hal yang dilakukannya sebelum interupsi terjadi. Sebagai contoh, saat kamu menekan tombol di keyboard komputer maka sebuah interupsi keyboard dikirimkan ke CPU. CPU akan merespon sinyal tersebut dengan menginterupsi yang sedang dilakukannya, membaca tombol yang kamu tekan, memprosesnya, dan kembali ke pekerjaan yang dilakukan CPU sebelum kamu menekan tombol tersebut.


Sekali lagi, kamu harus mengerti bahwa hal tersebut merupakan proses mekanis murni: Sebuah perangkat mensinyalkan interupsi hanya dengan mengaktifkan sebuah kabel. CPU dibangun sedemikian rupa sehingga saat kabel diaktifkan, CPU akan menyimpan informasi yang memadai tentang apa yang dikerjakannya saat ini sehingga ia dapat kembali ke keadaan yang sama nantinya. Informasi ini terdiri atas isi dari register internal yang penting seperti program counter. Kemudian CPU akan melompat ke lokasi memori tertentu yang telah ditentukan sebelumnya dan memulai mengeksekusi perintah yang tersimpan di sana. Intruksi- intruksi tersebut membentuk sebuah interrupt handler yang melakukan proses yang diperlukan dalam merespon interupsi. (Interrupt handler ini merupakan bagian dari perangkat lunak driver perangkat yang mensinyalkan interupsi.) Pada bagian akhir dari interrupt handler terdapat instruksi yang memerintahkan CPU untuk melompat kembali ke tugas yang sebelumnya dilakukan; Hal ini dilakukan dengan mengembalikan keadaan yang telah disimpan sebelumnya.


Interupsi memampukan CPU untuk mengatasi event asinkron. Dalam cycle ambil dan eksekusi reguler, berbagai hal terjadi dalam urutan yang telah ditentukan; semua yang terjadi "disinkronisasikan" dengan semua hal yang lainnya. Interupsi memungkinan CPU untuk mengatasi event yang terjadi "secara asinkron" dengan efisien, yakni yang terjadi dalam waktu yang tidak terprediksi.


Sebagai contoh lain bagaimana interupsi digunakan, pertimbangkan apa yang terjadi saat CPU memerlukan pengaksesan data yang disimpan di hard disk. CPU hanya dapat mengakses data secara langsung hanya jika data tersebut berada dalam memori utama. Data di disk harus disalin ke memori sebelum dapat diakses. Sayangnya, dalam skala kecepatan CPU beroperasi, disk drive sangatlah lambat. Ketika CPU memerlukan data dari disk, ia memberikan sinyal ke disk drive yang memerintahkannya untuk menentukan lokasi data dan mempersiapkannya. (Sinyal ini dikirim secara sinkron, di bawah kontrol dari program reguler.) Kemudian, daripada menunggu dalam waktu yang panjang dan tak terprediksi yang diperlukan disk drive untuk mengerjakan hal tersebut, CPU melanjutkan kerjanya yang lain. Ketika disk drive selesai mempersiapkan data, ia akan memberikan sinyal interupsi ke CPU. Interrupt handler kemudian dapat membaca data yang telah diminta.



Sekarang mungkin kamu telah memperhatikan bahwa kesemuanya tersebut masuk akal jika CPU sebenarnya memiliki beberapa tugas yang harus dikerjakan. Jika ia tidak memiliki hal lain yang lebih baik untuk dikerjakan, maka CPU mungkin akan menghabiskan waktunya melakukan polling terhadap masukan atau menunggu selesainya operasi disk drive. Semua komputer modern menggunakan metode multitasking untuk melakukan beberapa tugas bersamaan. Beberapa jenis komputer dapat digunakan oleh beberapa orang secara bersamaan. dikarenakan CPU sangatlah cepat, maka ia dapat memindahkan perhatiannya secara cepat dari satu pengguna ke pengguna lainnya dengan memberikan pecahan waktu untuk tiap pengguna sesuai gilirannya. Aplikasi dari multitasking ini disebut timesharing. Namun komputer personal modern dengan satu pengguna juga menggunakan multitasking. Sebagai contoh, pengguna dapat menulis paper sementara jam di komputer tetap menunjukkan waktu dan sebuah berkas sedang didownload dari jaringan.


Setiap tugas individual yang dilakukan CPU disebut sebagai thread. (Atau proses; ada perbedaan teknis antara thread dan proses, tetapi hal tersebut tidak penting disini, karena hanya thread yang digunakan di Java.) Banyak CPU secara harfiah dapat mengeksekusi lebih dari satu thread secara serentak -- CPU seperti ini memiliki banyak "inti", dimana setiap inti dapat menjalankan sebuah thread -- tetapi selalu ada batasan dari jumlah thread yang bisa dieksekusi dalam waktu yang sama. Karena sering sekali ada banyak thread yang dapat dieksekusi secara serentak, maka komputer harus mampu memindahkan perhatiannya dari satu thread ke thread lainnya, sama seperti komputer timesharing mengubah perhatiannya dari satu pengguna ke pengguna lainnya. Secara umum, thread yang sedang dieksekusi akan tetap berjalan sampai salah satu dari beberapa hal ini terjadi:

  • - Thread mungkin secara sukarela menyerahkan kontrolnya, untuk memberikan kesempatan untuk berjalan pada thread lainnya.
  • - Thread mungkin perlu menunggu beberapa event asinkron terjadi. Sebagai contoh, thread mungkin meminta beberapa data dari disk drive, atau ia mungkin menunggu pengguna menekan sebuah tombol. Sementara ia menunggu, thread akan diblok, dan thread lain, jika ada, membeli kesempatan untuk berjalan. Saat event yang ditunggu terjadi, interupsi akan "membangunkan" thread sehingga ia dapat meneruskan kegiatannya.
  • - Thread mungkin telah habis menggunakan potongan waktu yang diberikan dan ditunda kegiatannya untuk memberikan kesempatan thread lain berjalan. Tidak semua komputer dapat menunda "secara paksa" sebuah thread dengan cara tersebut; Komputer yang dapat melakukannya disebut menggunakan preemptive multitasking. Untuk melakukan preemptive multitasking, sebuah komputer memerlukan perangkat timer khusus yang menghasilkan sebuah interupsi secara berkala, misal 100 kali per detik. Ketika interupsi timer terjadi, CPU memiliki kesempatan untuk berpindah dari satu thread ke thread lainnya, tidak peduli apakah thread yang lagi bekerja menyukainya atau tidak. Semua komputer desktop dan laptop modern, dan bahkan smartphone dan tablet yang umum pun, menggunakan preemptive multitasking.

Pengguna biasa dan bahkan juga programmer biasa, tidak perlu berhubungan dengan interupsi dan interrupt handler. Mereka dapat berkonsentrasi pada tugas atau thread berbeda yang mereka ingin komputer lakukan; rincian akan bagaimana komputer melakukan semua tugas-tugas tersebut tidaklah penting untuk mereka. Bahkan kenyataannya, banyak pengguna, dan juga banyak programmer, dapat mengabaikan thread dan multitasking sama sekali. Tetapi, thread telah semakin menjadi penting dikarenakan komputer semakin canggih dan semakin memanfaatkan pengunaan multitasking dan multiproses. Dan kenyataannya, kemampuan untuk bekerja dengan thread menjadi hal yang esensial sebagai bagian dari kemampuan programmer. Untungnya, Java memiliki dukungan yang baik untuk thread, yang dibangun ke dalam bahasa pemrograman Java sebagai konsep pemrograman dasas. Pemrograman dengan thread akan dibahas di Bab 12.


Dasar konsep dari event asinkron secara umum sama pentingnya baik dalam Java dan pemrograman modern. Meskipun programmer kenyataannya tidak secara langsung berhadapan dengan interupsi, tetapi mereka sering mendapati bahwa mereka menulis event handlers, sama seperti interrupt handler yang dipanggil secara asinkron saat event tertentu terjadi. "Pemrograman berbasis event-driven" ini memiliki citarasa yang berbeda dari kebanyakan pemrograman sinkron tradisional. Kita akan memulai dengan jenis pemrograman tradisional, yang masih digunakan untuk memrogram tugas individual, tetapi kita akan kembali ke thread dan event nantinya, yang dimulai di Bab 6




Perangkat lunak yang melakukan penanganan semua interupsi, menangani komunikasi antar pengguna dan perangkat keras, dan mengontrol thread mana yang diperboleh untuk berjalan disebut Sistem Operasi. Sistem operasi merupakan perangkat lunak dasar dan penting yang tanpanya komputer tidak akan berfungsi. Program lainnya seperti pengolah kata dan penjelajah web, bergantung pada sistem operasi. Sistem operasi yang umumnya dikenal adalah Linux, beberapa versi Windows, dan Mac OS.


Sebelumnya: Cycle Ambil dan Eksekusi: Bahasa Mesin

Sabtu, 19 September 2015

Bagian 1.1 Cycle Ambil dan Eksekusi: Bahasa Mesin

by Unknown  |  in Pengenalan Pemrograman Menggunakan Java at  Sabtu, September 19, 2015
Artikel ini merupakan bagian buku Pengenalan Pemrograman Menggunakan Java

Sebelumnya: Pendahuluan

Bagian 1.1

Cycle Ambil dan Eksekusi: Bahasa Mesin


Komputer merupakan sebuah sistem yang kompleks yang terdiri dari banyak komponen yang berbeda. Tetapi di jantung -- atau di otak, jika anda lebih suka -- komputerlah terletak komponen utama yang melakukan proses komputasi yang sebenarnya. Komponen ini dinamakan Central Processing Unit, atau CPU. Di komputer desktop modern, CPU merupakan sebuah "chip" yang berukuran satu inci persegi. Tugas dari CPU ini adalah untuk menjalankan program.

Sebuah program merupakan daftar instruksi yang ditujukan untuk diikuti secara mekanis oleh komputer. Komputer dibangun untuk melaksanakan instruksi yang ditulis secara sederhana dalam bahasa yang disebut bahasa mesin. Tiap jenis komputer memiliki bahasa mesin tersendiri, dimana komputer hanya dapat mengeksekusi langsung program jika program tersebut dibuat dengan bahasa mesin tersebut. (Komputer dapat menjalankan program yang ditulis dalam bahasa lain jika terlebih dahulu program tersebut diterjemahkan ke dalam bahasa mesinnya.)

Saat CPU mengeksekusi sebuah program, program tersebut disimpan di memori utama komputer (dikenal juga sebagai RAM atau random access memory). Memori juga dapat memegang data yang digunakan atau diproses oleh program. Memori utama terdiri atas sebuah urutan dari lokasi. Lokasi ini diberi nomor dimana urutan nomor dari lokasi disebut sebagai alamat. Sebuah alamat memberikan sebuah cara untuk mengambil sebuah informasi tertentu dari jutaan informasi yang disimpan di memori. Saat CPU mengakses instruksi program atau data di lokasi tertentu, ia akan mengirimkan alamat dari informasi sebagai sinyal ke memori; memori akan merespon dengan mengirimkan data yang terkandung di alamat tertentu tersebut. CPU juga dapat menyimpan informasi di memori dengan cara menentukan informasi yang akan disimpan dan alamat dari lokasi dimana data akan disimpan.

Pada tingkatan bahasa mesin, operasi dari CPU cukup gamblang (walaupun sangat rumit secara rincinya). CPU mengeksekusi program yang disimpan sebagai sebuah urutan bahasa mesin di memori utama. Hal ini dilakukan dengan berulang-ulang membaca, atau mengambil, sebuah instruksi dari memori dan kemudian mengerjakan, atau mengeksekusi, instruksi tersebut. Proses ini -- mengambil sebuah instruksi, mengeksekusinya, mengambil instruksi lain, mengeksekusinya, dan begitu seterusnya -- disebut sebagai cycle ambil-dan-eksekusi. Dengan sebuah pengecualian, yang akan dijelaskan di bagian selanjutnya, Semua inilah yang dilakukan oleh CPU.

Rincian dari cycle ambil-dan-eksekusi tidaklah begitu penting, namun ada beberapa hal dasar yang harus kamu tahu. CPU memiliki beberapa register internal, yang merupakan unit memori kecil yang memiliki kemampuan untuk mempertahankan sebuah nomor atau instruksi bahasa mesin. CPU menggunakan salah satu dari register -- program counter, atau PC -- untuk merekam jejak dimana bagian program yang sedang dieksekusi. PC menyimpan alamat dari instruksi selanjutnya yang harus dikerjakan oleh CPU. Di permulaan dari ambil-dan-eksekusi cycle, CPU memeriksa PC untuk melihat instruksi mana yang harus diambil. Selama proses ambil-dan-eksekusi cycle, nomor dari PC diperbaharui untuk menunjukkan instruksi yang akan dieksekusi di cycle selanjutnya.(Biasanya, tidak selalu, merupakan instruksi yang diikuti secara berurutan pada instruksi terkini di program.)


Komputer mengeksekusi program bahasa mesin secara mekanis -- tanpa mengetahui atau berpikir tentangnya -- dikarenakan oleh cara penempatan fisik yang bersamaan. Ini memang bukan konsep yang mudah. Komputer merupakan sebuah mesin yang dibangun dari berjuta-juta saklar kecil yang disebut transistor, yang dibentuk sedemikian rupa sehingga mereka bisa dihubungkan bersama dimana keluaran dari satu saklar dapat menyalakan atau mematikan saklar lainnya. Saat komputer melakukan komputasi, saklar-saklar ini menyalakan dan mematikan satu sama lain dengan pola yang ditentukan oleh bagaimana mereka dihubungkan dan oleh program yang lagi dieksekusi komputer.

Instruksi bahasa mesin diekspresikan sebagai bilangan biner. Bilangan biner hanya terdiri dari dua digit kemungkinan, nol dan satu. Oleh karena itu, instruksi bahasa mesin hanyalah urutan dari nol dan satu. Tiap nol atau satu ini disebut bit. Jadi instruksi bahasa mesin hanya merupakan urutan dari nol dans atu. Tiap urutan tertentu mengkodekan instruksi tertentu. Data yang dimanipulasi oleh komputer juga dikodekan sebagain bilangan biner. Pada komputer modern, setiap lokasi memori menyimpan satu byte, yang merupakan urutan dari 8 buah bit. (Sebuah instruksi bahasa mesin atau sepotong data umumnya terdiri dari beberapa byte yang disimpan di lokasi memori yang berurutan.)

Komputer dapat bekerja secara langsung dengan bilangan biner dikarenakan saklar-saklar dapat mewakilkan bilangan tersebut: nyalakan saklar sebagai satu; matikan saklar sebagai nol. Instruksi bahasa mesin disimpan di memori sebagai pola dari nyalakan dan matikan saklar. Saat instruksi bahasa mesin dimuat ke CPU, yang terjadi adalah saklar-saklar tertentu dinyalakan atau dimatikan sesuai pola yang dikodekan oleh instruksi tersebut. CPU dibangun untuk merespon pola ini dengan mengeksekusi instruksi yang dikodekan; Hal ini dapat dilakukan dengan mudah dikarenakan oleh susunan hubungan di dalam CPU yang merupakan satu kesatuan.

Jadi, kamu harus memahami kerja komputer seperti ini: Memori utama memegang program bahasa mesin dan data. Dimana mereka dikodekan sebagai bilangan biner. CPU mengambil instruksi bahasa mesin dari memori satu demi satu dan mengeksekusinya. CPU melakukannya secara mekanis, tanpa memikirkan dan memahami apa yang dilakukannya -- dan oleh karena itu program yang dieksekusinya harus sempurna, lengkap secara rincinya, dan benar hal ini dikarenakan CPU hanya bisa mengeksekusi instruksi seperti apa yang tertulis. Inilah tampilan skematis dari tingkat-pertama pemahaman akan komputer:


Sebelumnya: Pendahuluan Selanjutnya: Event Asinkron: Loop Polling dan Interupsi

Jumat, 28 Agustus 2015

Fix error libgcrypt.so.11 for Brackets in Slackware64 Current

by Unknown  |  in Software at  Jumat, Agustus 28, 2015
In my journey to find the best text editor, I found 3 choice of editor to choose:
1. Sublime Text
2. Atom
3. Brackets

Currently, I'm using Sublime Text and it really good as a text editor with its multiple available plugins. But the down side for me Sublime Text is proprietary software. I need a good editor with Free Software/ Open Source license. So I only have 2 choice left.

As for Atom, the down side is its performance. About 1/6th of Sublime Text because it is based of chrome technology. So, it's a no for Atom too.

Now I need to test Brackets. But for now, Brackets can only be compiled for old libgcrypt15 in Slackware64 14.1. In Slackware64 current, libgcrypt20 was installed replacing the old one.
After installing Bracket Package, we'll get an error:
 /usr/bin/brackets: error while loading shared libraries: libgcrypt.so.11: cannot open shared object file: No such file or directory  
Because Brackets try to find old libgcrypt which not installed on Slackware64 current.

To fix the error, we can do a simple trick by copying old libgcrypt, libgcrypt.so.11.8.2 file, from Slackware64-14.1 to Brackets installation folder then make a symbolic link to /usr/lib/libgcrypt.so.11.

Here the simple instruction step to our Slack brain:
1. Get Brackets package for Slackware64 14.1 from Ponce package,
1. Get old libgcrypt package from Slackware64 14.1,
2. Extract the package and get the libgcrypt.so.11.8.2 file,
3. copy libgcrypt.so.11.8.2 file to Brackets installation folder, for me in /opt/brackets/,
4. Make a symbolic link to libgcrypt.so.11.8.2, like this:
 ln -s /opt/brackets/libgcrypt.so.11.8.2 /usr/lib64/libgcrypt.so.11  
5. Try running Brackets.


FYI, as I'm writing this post I read a comment from Brackets github issue for generating an installable old libgcrypt package for Slackware 14.1. But I never test it, but I think that is the better way to fix Brackets error because we don't need to dirty our system by copying untracked library.

DWYOR.


Reference:
1. www.slackware.com 
2. That which could be fixed in SBo thread, http://www.linuxquestions.org/questions/slackware-14/that-which-could-be-fixed-in-sbo-thread-4175532869/page13.html
3. Unix Create a Symbolic Link, http://www.cyberciti.biz/faq/unix-creating-symbolic-link-ln-command/

Minggu, 12 April 2015

learning musicXML, Library and Tutorial

by Unknown  |  in pemrograman at  Minggu, April 12, 2015
Well, beside learning Canvas and Graphics in Java, I also learning musicXML now. For now, I still don't grasp the main idea of reading musicXML. Need more times to understand and mastering it.

I also have collecting some stuffs related to musicXML, here the list:
A. musicXML library

  1. MusicXml.Net (.Net Language)
  2. VexFlow (HTML5)
  3. ProxyMusic (Java Language)
B. Tutorial
All of the files have been collected in my Google Drive in case if the sources have been deleted.

Minggu, 19 Oktober 2014

Error after Android Support Library to version 21

by Unknown  |  in Pengenalan Pemrograman Menggunakan Java at  Minggu, Oktober 19, 2014
At 17 October 2014 Google release Android 5.0 as Android API 21. As an Android developer, I promptly to download and applying it to my applications and update all of my . Because all of my applications depends on AppCompat I also update the Android Support Library to version 21. FYI, I use eclipse Juno as my main IDE.

After updating the AppCompat, all of my applications getting some error. Trying to go back to Android Support Library version 20 to get them working again but fail because there is no turning back to version 20 after updated.

Fortunately, the solution is very simple. Just open the project.properties for the AppCompat project folder and change the target value to android-21

Selasa, 16 September 2014

Hiding ActionBar Tab When Changing Fragment

by Unknown  |  in pemrograman visual at  Selasa, September 16, 2014
There is no method like hideTab for hiding ActionBar Tab, but we can achieve the same effect by using ActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD). If we use add fragment when calling a fragment, we must override  onHiddenChange(boolean hidden) fragment method to check if fragment is shown or not then determine to show or hide the tabs.

Here the code in action:
      ActionBar mActionBar;  // get action bar   
     @Override  
     public void onHiddenChanged(boolean hidden) {  
         super.onHiddenChanged(hidden);  
       if (hidden) {  
         //do when hidden  
           mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);  
       } else {  
         //do when show  
           mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
       }  
     }  

This code will detect the fragment status whether hidden or not. If hidden value is true then the Tab will be hidden, if the hidden value is false then the Tab will be show.


Happy Programming ;)




Rabu, 03 September 2014

Error saat menerapkan tema sharedPreferences di Android

by Unknown  |  in pemrograman visual at  Rabu, September 03, 2014
Ada sebuah kendala saat mencoba membuat setting tema untuk aplikasi Android milik saya. Saat tema diterapkan (Gambar 1) melalui sebuah Fragment dengan
(implements SharedPreferences.OnSharedPreferenceChangeListener) untuk kedua kalinya, maka aplikasi akan force close dan mengeluarkan pesan error berupa java.lang.NullPointerException. Saat penerapan tema, aplikasi akan dimatikan dan dijalankan kembali.

Gambar 1. Setting tema

Masalah ini dapat diatasi dengan menambahkan baris kode berikut di fragment:
    private SharedPreferences sharedPreferences;
    @Override
public void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes          
        sharedPreferences.registerOnSharedPreferenceChangeListener(this);
    }
    @Override
public void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes          
        sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);  
    }


Jangan lupa untuk menambahkan baris kode berikut yang berfungsi untuk menginisialisasi variabel sharedPreferences di OnCreate():
PreferenceManager preferenceManager = getPreferenceManager();
sharedPreferences = preferenceManager.getSharedPreferences();
sharedPreferences.registerOnSharedPreferenceChangeListener(this);

Happy Programming... :D ;)



referensi: 

  1. http://stackoverflow.com/a/5890472
  2. https://github.com/Prototik/HoloEverywhere/issues/576

Senin, 30 Juni 2014

How To Create Button With Different Color In Android

by Unknown  |  in Tutorial at  Senin, Juni 30, 2014
There is an easy way to change the color of default button in Android that I found from stackoverflow. We only need to create an xml for custom color (we name it custom_button.xml in res/drawable), add color value (in res/values/color.xml), and add android:background="@drawable/custom_button" tag in our button in layout. All of the code explained here can be downloaded from my github.

Here is my default button before editing:


These are the step to customize our button:

1. Add color value in res/value/color.xml. I use blue base color for button. Here the code:
    <color name="blue_middle">#3C73FF</color>    <color name="blue">#33b5e5</color>    <color name="blue_hard">#2ea9d6</color>
2. Add custom_button.xml in res/drawable. Here the code:
<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <gradient
                android:startColor="@color/blue_hard"
                android:endColor="@color/blue"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/blue_middle" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item android:state_focused="true" >
        <shape>
            <gradient
                android:endColor="@color/blue"
                android:startColor="@color/blue"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/blue_middle" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>      
        <shape>
            <gradient
                android:endColor="@color/blue"
                android:startColor="@color/blue"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/blue" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector> 
3. Add tag android:background="@drawable/custom_button" for the button in the layout. For example, here is my button code in layout (the bold text is the tag):
<Button
        android:id="@+id/buttonOpen"
        android:layout_width="300sp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10sp"
        android:text="@string/login_screen_button_open"
        android:background="@drawable/custom_button"/>



Now, after applying these step, we will get our button like this:



 Voila, we finished it.... :D


Selasa, 24 Juni 2014

Set items ActionBar Position

by Unknown  |  in pemrograman visual at  Selasa, Juni 24, 2014
To positioning menu items of ActionBar, we can use android:menuCategory="system" and android:orderInCategory tag. the lower value of android:orderInCategory tag will be placed on the left. OrderInCategory will determines the order appearance, from low to high.

From my case, before I use these tag, with the following code in my res/menu/main.xml:

<menu 
...
<item
        android:id="@+id/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        android:orderInCategory="1"
        app:showAsAction="collapseActionView|ifRoom"
        android:title="@string/action_search_unit"/>
    <item
        android:id="@+id/menu_share"
        android:icon="@drawable/ic_action_share"
        android:title="Share"
        android:orderInCategory="10"
        app:showAsAction="always"/>
    
    <item
        android:id="@+id/action_help"
        android:icon="@drawable/ic_action_help"
        android:showAsAction="ifRoom"
        android:orderInCategory="50"
        android:title="Help"/>
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"/>

</menu>

The result is like the picture in Picture 1:


Picture 1. Before using android:menuCategory="system"

Eventhough the value of android:OrderInCategory of Search menu item is the lowest of the all menu items, the icon still in the second place from the left.


So to force Search menu item to the left, we must add android:menuCategory="system" to all of menu items in res/menu/main.xml :

<menu 
     ...
    <item
        android:id="@+id/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        android:menuCategory="system"
        android:orderInCategory="1"
        app:showAsAction="collapseActionView|ifRoom"
        android:title="@string/action_search_unit"/>
    <item
        android:id="@+id/menu_share"
        android:icon="@drawable/ic_action_share"
        android:title="Share"
        android:menuCategory="system"
        android:orderInCategory="10"
        app:showAsAction="always"/>
    
    <item
        android:id="@+id/action_help"
        android:icon="@drawable/ic_action_help"
        android:showAsAction="ifRoom"
        android:orderInCategory="50"
        android:menuCategory="system"
        android:title="Help"/>
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        android:menuCategory="system"
        app:showAsAction="never"/>

</menu>

Now, we get the Search menu item on the left like the picture in Picture 2:


Picture 2. After using android:menuCategory="system"


Happy Coding.. :D ;).