Lập trình Android đôi khi là một công việc nhàm chán khi bạn phải viết đi viết lại 1 đoạn code dài đến vài dòng chỉ để làm những tác vụ đơn giản. Java là 1 ngôn ngữ được coi là khá "rườm rà" so với những ngôn ngữ mới hiện nay, và điều đó làm cho bạn không thể hoàn toàn tập trung vào việc xử lý phần logic khi mà code của bạn bị sắp xếp một cách lộn xộn và khó theo dõi.
Sau đây là một ví dụ
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);
}
}
Ở bài này mình sẽ giới thiệu với các bạn 1 thư viện có thể phần nào giải quyết cái sự rườm rà của việc lập trình ứng dụng cho Android, đó là Butter Knife. 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.
Thêm vào build.gradle trong project của bạn:
compile 'com.jakewharton:butterknife:7.0.1'
Đừng quên thêm cả dòng này để chặn lint warning:
lintOptions { disable 'InvalidPackage' }
Butter Knife dùng để làm gì? Use case phổ biến 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 {
@Bind(R.id.text_view) TextView mTextView;
@Bind(R.id.edit_text) EditText mEditText;
@Bind(R.id.button) Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
}
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, @BindDimen hay @BindDrawable,... Bạn chỉ cần có id đúng là xong:
@BindString(R.string.some_string) String mString;
@BindDrawable(R.drawable.button_drawable) Drawable mDrawable;
Sử dụng với ViewHolder
Với sự ra đời của RecyclerView, có lẽ việc sử dụng ViewHolder pattern đã trở nên quen thuộc với tất cả các lập trình viên Android. Giống như đối với Activity hay Fragment, Butter Knife cũng giúp chúng ta tránh việc phải viết các hàm tìm kiếm view như sau:
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);
}
}
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.submit)
public void submit(View view) {
// TODO viết code chạy khi ấn vào view có id `R.id.submit`
}
Ngoài @OnClick chúng ta còn có thể dùng
- @OnLongClick
- @OnPageChange
- @OnTextChanged
- @OnTouch
- @OnItemClick
- @OnItemLongClick
- @OnItemSelected
- @OnCheckedChanged
Gộp View vào 1 List hoặc Array
@Bind({R.id.text1, R.id.text2, R.id.text3})
List<TextView> mTexViewList;
Apply thuộc tính vào tất cả các View trong List
Bạn có thể set 1 thuộc tính (ví dụ như alpha) vào 1 List các View như sau:
ButterKnife.apply(mTexViewList, View.ALPHA, 0.0f);
Tìm đến 1 view cụ thể
Butter Knife cung cấp hàm findById() để bạn tìm 1 view cụ thể nào đó. Tuy nhìn hơi giống findViewById() nhưng bạn lại không cần phải cast khi sử dụng hàm này
View view = LayoutInflater.from(context).inflate(R.layout.main_layout, null);
TextView firstName = ButterKnife.findById(view, R.id.text_first_name);
TextView lastName = ButterKnife.findById(view, R.id.text_last_name);
ImageView photo = ButterKnife.findById(view, R.id.image_photo);
Post a Comment
Post a Comment