In this tutorial we’re going to discuss the Android ButterKnife tool and look into it’s usages.
Android ButterKnife
Android Butterknife is a view binding tool that uses annotations to generate boilerplate code for us. ButterKnife is developed by Jake Wharton at Square and is essentially used to save typing repetitive lines of code like findViewById(R.id.view)
when dealing with views, thus making our code look a lot cleaner.
ButterKnife Android Dependency
To use ButterKnife in android application we need to add the following dependency to our build.gradle
file.
1 2 3 |
compile 'com.jakewharton:butterknife:6.1.0' |
Android ButterKnife inject
Before using any views, we need to inject ButterKnife by adding below code in onCreate()
method of the activity.
1 2 3 |
ButterKnife.inject(this); |
Note: When using fragments we need to specify the source of the view in the onCreateView()
as below.
1 2 3 4 |
View view = inflater.inflate(R.layout.sample_fragment, null); ButterKnife.inject(this, view); |
Android ButterKnife Example
A simple activity example with ButterKnife is shown below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class MainActivity extends Activity { @InjectView(R.id.sample_text) TextView textView; @InjectView(R.id.sample_button) Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); textView.setText("You can change this view accordingly"); @OnClick(R.id.click_button) void buttonClick() { //..you don't even need the line @InjectView(R.id.click_button) if this button isn't being used else where } } } |
In the above code snippet, @OnClick
is the ButterKnife annotation that removes the need for the setOnClickListener
method. The method below is automatically configured to that annotation. An argument inside the method is optional.
We can specify multiple IDs in a single binding for common event handling as shown below.
1 2 3 4 5 6 |
@OnClick({ R.id.btn1, R.id.btn2, R.id.btn3 }) public void commonMethod(Button button) { button.setText("Text specified here would be same for all"); } |
In the above code a specific type of view (Button) is automatically casted.
An example of implementing ButterKnife in fragments is given below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class SomeFragment extends Fragment { @InjectView(R.id.textView) TextView textView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater .inflate(R.layout.some_layout, container, false); ButterKnife.inject(this, rootView); //Work on the TextView someTextView.setVisibility(View.VISIBLE); return rootView; } @OnClick({ R.id.imageView, R.id.someTextView }) public void doSomething() { //Do something when imageView or someTextView is clicked. } @Override public void onDestroyView() { super.onDestroyView(); //Set views to null: ButterKnife.reset(this); } } |
For a ListView itemClick the following annotation is used.
1 2 3 4 5 6 |
@OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... } |
Note: An exception will be raised if the target view is not found. To suppress this exception we can add a @Nullable
annotation, thereby making it an optional binding.
This brings an end to ButterKnife in android short tutorial. For a complete example, please read Android Notification.
Reference: ButterKnife at GitHub