Butter Knife, thư viện hỗ trợ gán view và callback dành cho Android tiện lợi

1.Giới thiệu

Butter Knife được phát triển bởi Jake Wharton, lập trình viên chủ đạo của Square, bạn nào hay theo dõi những thư viện mã nguồn mở thì chắc chắn đã ít nhất 1 lần nghe đến tên công ty này, bởi Square sở hữu các thư viện nổi tiếng bậc nhất dành cho Android như Picasso, Retrofit hay Okhttp.

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;
    private EditText mEditText;
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view);
        mEditText = (EditText) findViewById(R.id.edit_text);
        mButton = (Button) findViewById(R.id.button);
    }
}

Đoạn code trên là 1 trong những ví dụ điển hình nhất về việc lặp code 1 cách không cần thiết khi lập trình Android mà bất cứ 1 ai cũng đã từng trải qua, việc gọi nó quá nhiều sẽ làm cho hàm chứa nó (ở đây là onCreate) nhìn rất lộn xộn.

Ở bài viết này mình sẽ hướng dẫn các bạn sử dụng Butter Knife để code ngắn gọn hơn

butterknife-trong-android

Thêm vào build.gradle trong project của bạn:

apply plugin: 'android-apt'
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'

butterknife-trong-android-1

Tại dependence thêm classpath:

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

butterknife-trong-android-2

Vậy thì Butter Knife dùng để làm gì? Thường được sử dụng nhất của Butter Knife là để gán view vào trường trong 1 Activity hay Fragment. Như đoạn code ở trên có thể được viết lại như sau:

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.editEmail)
    EditText edtEmail;
    @BindView(R.id.edtPassword)
    EditText edtPass;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
    @OnClick(R.id.btnLogin)
    public void loginAccount() {
        String email = edtEmail.getText().toString();
        String passWord = edtPass.getText().toString();
        Toast.makeText(this, email + "\n" + passWord, Toast.LENGTH_SHORT).show();
    }
}

Ngắn và dễ nhìn hơn rất nhiều! Khi bạn sử dụng Annotation BindView cùng với 1 id, Butter Knife sẽ tự động tìm đến id đó trong layout và cast nó sang view tương ứng.
Lưu ý nhỏ là bạn phải gọi ButterKnife.bind(this) trong hàm onCreate()

Không chỉ vậy Butter Knife còn có rất nhiều thứ hay ho:

1. Gán resource

Butter Knife cho phép chúng ta gán resource một cách trực tiếp sử dụng các annotation như @BindString, @BindColor hay @BindDrawable,…

@BindString(R.string.website) String webName;
@BindColor(R.color.colorPrimary) String Color;
@BindDrawable(R.drawable.drawable) Drawable mDrawable;

2. Sử dụng với ViewHolder

Tương tự với MainActivity chúng ta cũng có thể sử dụng nó trong viewHolder

class CustomViewHolder extends RecyclerView.ViewHolder {
    @Bind(R.id.title) TextView mTitle;
    @Bind(R.id.description) TextView mDescription;

    public CustomViewHolder(View view) {
      super(view);
      ButterKnife.bind(this, view);
    }
}

3. Gán các listener

Butter Knife cung cấp cho chúng ta các annotation cần thiết để bind những listener phổ biến nhất trong Android. Ví dụ cách sử dụng:

   @OnClick(R.id.btnLogin)
    public void loginAccount() {
        String email = edtEmail.getText().toString();
        String passWord = edtPass.getText().toString();
        Toast.makeText(this, email + "\n" + passWord, Toast.LENGTH_SHORT).show();
    }

goài @OnClick chúng ta còn có thể dùng

  • @OnLongClick
  • @OnPageChange
  • @OnTextChanged
  • @OnTouch
  • @OnItemClick
  • @OnItemLongClick
  • @OnItemSelected
  • @OnCheckedChanged

4.Chỉ định nhiều ID trong một ràng buộc duy nhất để xử lý sự kiện thông thường.

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
 public void onClick(View view) {
        switch (view.getId()) {
            case R.id.door1:
                //Do someting
                break;
            case R.id.door2:
                //Do someting
                break;
           }
}

 

Ngoài ra còn một vài công dụng khác các bạn có thể xem thêm tại 2 trang web dưới đây.

http://jakewharton.github.io/butterknife/

https://viblo.asia/haint.fit12/posts/WkwGnWmNv75g

 

Nguyễn Linh

Chia sẻ để cùng tiến bộ...

Bình luận đã bị khoá.