В этом кратком совете вы узнаете, как интегрировать библиотеку Butter Knife в свои проекты, чтобы легко создавать экземпляры представлений в макете в коде приложения.
Вступление
В каждом приложении Android вы должны использовать метод findViewById()
для каждого представления в макете, которое вы хотите использовать в коде вашего приложения. Но по мере того как проекты приложений получают более сложные макеты, вызов этого метода становится повторяющимся, и именно здесь появляется библиотека Butter Knife .
Библиотека Butter Knife, разработанная и поддерживаемая Jake Wharton (Square Inc.), содержит аннотации, которые помогают разработчикам создавать экземпляры наших действий или фрагментов. Он также имеет аннотации для обработки таких событий, как onClick()
, onLongClick()
и т. Д.
В примере проекта этого руководства вы можете увидеть пример приложения с одним действием и одним фрагментом с реализацией с использованием библиотеки Butter Knife и обычной реализацией. Давайте рассмотрим шаги, необходимые для интеграции библиотеки Butter Knife.
1. Использование библиотеки ножей для масла
Шаг 1: Добавьте зависимость
Добавьте следующую зависимость в файл build.gradle проекта:
1
|
compile ‘com.jakewharton:butterknife:6.1.0’
|
Затем синхронизируйте ваш проект с этим файлом, нажав кнопку синхронизации.
Шаг 2: Используйте аннотации
В каждом действии или фрагменте необходимо удалить или закомментировать каждый вызов метода findViewById()
и добавить аннотацию @InjectView
перед объявлением переменной, указывая идентификатор представления.
1
2
|
@InjectView(R.id.sample_textview)
TextView sample_textview;
|
Шаг 3: Внедрить представления
В onCreate()
действия onCreate()
перед использованием любых представлений Позвоните inject
на объекте Butterknife
.
1
|
ButterKnife.inject(this);
|
Если вы используете фрагменты, вы должны указать источник представлений в onCreateView()
как показано ниже.
1
2
|
View view = inflater.inflate(R.layout.sample_fragment, null);
ButterKnife.inject(this, view);
|
Теперь вы можете начать использовать представления в коде вашего приложения. Нож для масла подойдет для каждого экземпляра.
Это все, что вам нужно сделать, чтобы использовать библиотеку Butter Knife в упражнении или фрагменте. В следующем разделе я покажу вам, как использовать библиотеку Butter Knife для использования представлений списка.
2. Использование библиотеки Butter Knife с представлениями списка
Класс ListView
является особым случаем для реализации, потому что вы создаете экземпляры представлений внутри адаптера. Чтобы интегрировать библиотеку Butter Knife в представление списка, сначала необходимо создать собственный макет для элементов в представлении списка. Я собираюсь назвать мой list_view_item
и добавить следующий макет:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<?xml version=»1.0″ encoding=»utf-8″?>
<RelativeLayout
xmlns:android=»http://schemas.android.com/apk/res/android»
android:layout_width=»match_parent»
android:layout_height=»match_parent»
android:padding=»10dp»
android:background=»@android:color/white»>
<ImageView
android:id=»@+id/image_in_item»
android:layout_width=»100dp»
android:layout_height=»100dp»/>
<TextView
android:id=»@+id/textview_in_item»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:textSize=»16sp»
android:layout_toRightOf=»@+id/image_in_item»
android:layout_marginLeft=»10dp»/>
</RelativeLayout>
|
В этом простом макете мы собираемся показать изображение и текст. Далее нам нужно создать адаптер для представления списка. Давайте ListViewAdapter
это ListViewAdapter
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class ListViewAdapter extends BaseAdapter {
LayoutInflater inflater;
public ListViewAdapter(LayoutInflater inflater){
this.inflater = inflater;
}
@Override
public int getCount() {
return 5;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
static class ViewHolder{
public ViewHolder(View view){
}
}
}
|
Внутри класса адаптера есть статический класс под названием ViewHolder
чтобы держать его в порядке. Мы собираемся использовать этот класс, чтобы содержать представления. Давайте реализуем класс ViewHolder
следующим образом:
01
02
03
04
05
06
07
08
09
10
|
static class ViewHolder{
@InjectView(R.id.image_in_item)
ImageView image;
@InjectView(R.id.textview_in_item)
TextView text;
public ViewHolder(View view){
ButterKnife.inject(this, view);
}
}
|
Все, что нам нужно сделать сейчас, это изменить метод getView()
следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View view = inflater.inflate(R.layout.list_view_item, parent, false);
holder = new ViewHolder(view);
Picasso.with(inflater.getContext())
.load(«http://lorempixel.com/200/200/sports/» + (position+1))
.into(holder.image);
holder.text.setText(«This is a text for the image number: «+position);
return view;
}
|
В этом методе я раздуваю пользовательский макет внутри переменной view
и использую его для создания объекта класса ViewHolder
. Обратите внимание, что мы используем класс Picasso
для загрузки удаленных изображений и заполнения текстового представления некоторым текстом. Вы можете найти учебник по Пикассо полезным, если хотите поближе познакомиться с этой библиотекой.
Не забудьте добавить разрешение android.permission.Internet
в манифест Android. Если вы этого не сделаете, Picasso не сможет подключиться к Интернету и загрузить удаленные изображения.
1
|
<uses-permission android:name=»android.permission.INTERNET»/>
|
Наконец, все, что вам нужно сделать, это создать экземпляр списка и подключить адаптер. Я собираюсь сделать это внутри нового действия, ListViewActivity
, как показано ниже. Вы можете увидеть пример этой реализации в исходных файлах этого урока.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public class ListViewActivity extends ActionBarActivity {
@InjectView(R.id.listView)
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
ButterKnife.inject(this);
list.setAdapter(new ListViewAdapter((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)));
}
}
|
3. События
Вы также можете использовать аннотации Butter Knife для событий. Выберите аннотацию, которую вы хотите использовать, в соответствии с событием, на которое вы хотите ответить, и поместите ее перед методом, который вы хотите выполнить, когда событие произойдет.
1
2
3
4
|
@OnClick(R.id.sample_textview)
public void showToastMessage(){
Toast.makeText(MainActivity.this, «This is a message from the activity», Toast.LENGTH_SHORT).show();
}
|
Вывод
Вы можете использовать метод Butter Knife inject()
везде, где вы в противном случае использовали бы метод findViewById()
чтобы сэкономить время и избежать повторения кода, когда вам приходится создавать экземпляры представлений в макете. Не стесняйтесь поделиться этим кратким советом, если вы нашли его полезным.