Статьи

Подсказка: использование ножа масла для добавления видов на Android

В этом кратком совете вы узнаете, как интегрировать библиотеку Butter Knife в свои проекты, чтобы легко создавать экземпляры представлений в макете в коде приложения.

В каждом приложении Android вы должны использовать метод findViewById() для каждого представления в макете, которое вы хотите использовать в коде вашего приложения. Но по мере того как проекты приложений получают более сложные макеты, вызов этого метода становится повторяющимся, и именно здесь появляется библиотека Butter Knife .

Библиотека Butter Knife, разработанная и поддерживаемая Jake Wharton (Square Inc.), содержит аннотации, которые помогают разработчикам создавать экземпляры наших действий или фрагментов. Он также имеет аннотации для обработки таких событий, как onClick() , onLongClick() и т. Д.

В примере проекта этого руководства вы можете увидеть пример приложения с одним действием и одним фрагментом с реализацией с использованием библиотеки Butter Knife и обычной реализацией. Давайте рассмотрим шаги, необходимые для интеграции библиотеки Butter Knife.

Добавьте следующую зависимость в файл build.gradle проекта:

1
compile ‘com.jakewharton:butterknife:6.1.0’

Затем синхронизируйте ваш проект с этим файлом, нажав кнопку синхронизации.

Нажмите кнопку, чтобы синхронизировать проект с файлами оценок

В каждом действии или фрагменте необходимо удалить или закомментировать каждый вызов метода findViewById() и добавить аннотацию @InjectView перед объявлением переменной, указывая идентификатор представления.

1
2
@InjectView(R.id.sample_textview)
TextView sample_textview;

В 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 для использования представлений списка.

Класс 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)));
    }
}

Вы также можете использовать аннотации 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() чтобы сэкономить время и избежать повторения кода, когда вам приходится создавать экземпляры представлений в макете. Не стесняйтесь поделиться этим кратким советом, если вы нашли его полезным.