Senangkan hidup guna Butter Knife library untuk pengaturcaraan android

December 04, 2015

Macam yang saya ceritakan sebelum ini, saya belajar android lama dulu dan tak bermula dengan Java. Dulu saya tak pandai, saya tak tahu guna library. Apatah lagi, budaya pengaturcaraan guna Eclipse perlu download JAR untuk library tambahan.

Tapi kini, alhamdulillah android telah matang. Android Studio memudahkan kita menggunakan library untuk menyenangkan hidup dan mempercepatkan kerja.

Rugi kalau kita tak guna library. Ada banyak library yang boleh memudahkan kerja kita sebagai pengatur cara. Pada artikel kali ini, saya ingin menerangkan tentang Butter Knife library.

Apa tujuan Butterknife ini dibina

Butter Knife dibina untuk memudahkan pengatur cara merujuk kepada elemen (widget) di dalam View menggunakan annotation @Bind.

Selain daripada itu, boleh juga guna annotation @ untuk listener pada butang seperti OnClick OnLongClick dan lain-lain.

Contohnya tanpa Butter Knife apabila kita nak rujukkan suatu elemen dalam View pada Java code, kita akan menaip seperti berikut:

class ExampleActivity extends Activity {
  TextView title;
  Button btn;
  TextView footer;

  @Override 
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    title = (TextView) findViewById();
  }
}

Tapi, dengan Butter Knife library, hasil yang sama boleh ditulis seperti :

class ExampleActivity extends Activity {
  @Bind(R.id.title) TextView title;
  @Bind(R.id.subtitle) TextView subtitle;
  @Bind(R.id.footer) TextView footer;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields…
  }
}

Nampak? Ya benar boleh kurangkan menaip. Tapi pada pendapat saya, lebih baik daripada itu, kod kita akan kelihatan lebih tersusun.

Seorang pengatur cara yang sebenar, sentiasa menghasilkan kod yang bila dia baca balik kod yang telah ditinggalkan selepas 20 tahun, dia tak mengambil masa yang lama untuk faham. Bukan sebab dia dah pandai koding tapi sebab 20 tahun dulu dia menulis kod dengan tersusun dan sistematik.

Jika anda macam saya, iaitu belajar coding sendirian daripada internet. Kemudian selepas bertahun-tahun, anda mula memikirkan anda masih beginner atau tidak. Penilaian paling senang ialah lihat pada kod anda. Jika kod anda tersusun dan orang lain boleh faham kod anda bila membacanya. Maka itu tanda anda dah melepasi zaman beginner.

Macam mana nak guna library Butter Knife ini?

Cara guna library mudah je, cuma tulis @Bind(R.id.textview_title) TextView title; untuk widget yang nk di bind kan. Dokumentasi Butter Knife ini mengajar penuh cara nak guna librarry ButterKnife ni.

Untuk menggunakan library dengan gradle di Android Studio amatlah senang, cuma tambah dependencies pada build.gradle.

compile ‘com.jakewharton:butterknife:7.0.1

Lepas itu Android Studio akan minta anda sync gradle. Klik sync dan lepas gradle siap build, kita dah pun boleh menggunakan library ini.

Contoh penggunaan gradle

Saya ikut tutorial buat aplikasi Todo di Codepath untuk tujuan belajar cara guna library ini. Berikut hasilnya :

  1. Kod yang lebih tersusun. Saya tak perlu initialize widget dalam OnCreate() lagi. Dan anda boleh nampak macam mana saya pisahkan OnClick() pada butang tambah todo (Add Todo) di luar OnCreate().

  2. Kod lebih pendek. Tapi dalam aplikasi todo ini, sebab kod memang pendek, jadi tak nampak ketara sangat. Jimat 6 baris je.

Jika kod anda tersusun dan orang lain boleh faham kod anda bila membacanya. Maka itu tanda anda dah melepasi zaman beginner.

Tanpa Butter Knife :

public class MainActivity extends AppCompatActivity {
  private ArrayList<String> items;
  private ArrayAdapter<String> itemsAdapter;

  ListView lvItems;
  EditText newTodo;
  Button addTodo;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    lvItems = (ListView) findViewById(R.id.lv_todo);
    newTodo = (EditText) findViewById(R.id.et_todo);
    addTodo = (Button) findViewById(R.id.btn_add_todo);

    readItems();

    itemsAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
    lvItems.setAdapter(itemsAdapter);

    // add todoItem
    addTodo.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        String item = newTodo.getText().toString();
        itemsAdapter.add(item);
        newTodo.setText("");
        writeItems();
      }
    });

    // remove todoItem
    lvItems.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
      @Override
      public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long id) {
        items.remove(pos);
        itemsAdapter.notifyDataSetChanged();

        writeItems();

        return true;
      }
    });
  }

  // persistence : saved data to file then re-read on next time used
  private void readItems(){
    File filesDir = getFilesDir();
    File todoFile = new File(filesDir, “todo.txt”);

    try {
      items = new ArrayList<String>(FileUtils.readLines(todoFile));
    }catch (IOException e){
      items = new ArrayList<String>();
    }
  }

  private void writeItems(){
    File fileDir = getFilesDir();
    File todoFile = new File(fileDir, “todo.txt”);

    try {
      FileUtils.writeLines(todoFile, items);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
    
  // … menu …
}

Kod guna Butter Knife library :

public class MainActivityWithButterknife extends AppCompatActivity {

  private ArrayList<String> items;
  private ArrayAdapter<String> itemsAdapter;

  @Bind(R.id.lv_todo) ListView lvItems;
  @Bind(R.id.et_todo) EditText newTodo;
  @Bind(R.id.btn_add_todo) Button addTodo;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    readItems();

    itemsAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
    lvItems.setAdapter(itemsAdapter);
  }

  // add todoItem
  @OnClick(R.id.btn_add_todo)
  public void addTodo(){
    String item = newTodo.getText().toString();

    itemsAdapter.add(item);
    newTodo.setText("");
    writeItems();
  }

  // remove todoItem
  @OnItemLongClick(R.id.lv_todo)
  public boolean removeTodo(int position){
    items.remove(position);
    itemsAdapter.notifyDataSetChanged();
    writeItems();
    return true;
  }

  // persistence : saved data to file then re-read on next time used
  private void readItems(){
    File filesDir = getFilesDir();
    File todoFile = new File(filesDir, “todo.txt”);

    try {
      items = new ArrayList<String>(FileUtils.readLines(todoFile));
    }catch (IOException e){
      items = new ArrayList<String>();
    }
  }

  private void writeItems(){
      File fileDir = getFilesDir();
      File todoFile = new File(fileDir, “todo.txt”);

      try {
          FileUtils.writeLines(todoFile, items);
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
}

Penutup

Pada masa kini, terdapat ramai pembangun yang suka berkongsi kod-kod mereka. Github menghoskan banyak library yang boleh digunakan secara percuma oleh pembangun-pembangun yang lain. Jadi ambil peluang ini, guna library untuk memudahkan dan mempercepatkan menghasilkan produk anda.

Saya guna android-arsenal sebuah laman web untuk anda mencari library khas kepada android.

Dalam artikel mendatang saya akan cuba memperkenalkan library lain yang saya seronok dan suka menggunakannya. Sekarang saya guna ada guna realm-java tapi sebab library ini tak cukup kemas lagi, saya akan tangguhkan dulu artikel pasalnya. Ada nak cadang saya perkenalkan library mana-mana? Tinggalkan komen di bawah.

2023, Built with Gatsby

Hire MeNota & idea