Android
Нож для масла
Поиск…
Вступление
Butterknife - это инструмент привязки к виду, который использует аннотации для создания шаблона кода для нас. Этот инструмент разработан Jake Wharton at Square и по существу используется для сохранения повторяющихся строк кода, таких как findViewById(R.id.view)
при работе с представлениями, что делает наш код намного более чистым.
Чтобы быть ясным, Butterknife не является библиотекой инъекций зависимости . Butterknife вводит код во время компиляции. Это очень похоже на работу Аннотаций Android.
замечания
Нож для масла
Связывание полей и методов для представлений Android, использующих обработку аннотаций для создания шаблона кода для вас.
- Устраните вызовы findViewById с помощью полей @BindView.
- Группируйте несколько видов в списке или массиве. Действуйте со всеми из них сразу с действиями, сеттерами или свойствами.
- Устранение анонимных внутренних классов для слушателей путем аннотирования методов с помощью @OnClick и других.
- Устраните поиск ресурсов, используя аннотации ресурсов в полях.
Дополнительная информация: http://jakewharton.github.io/butterknife/
Лицензия
Copyright 2013 Джейк Уортон
Лицензируется по лицензии Apache, версия 2.0 («Лицензия»); вы не можете использовать этот файл, кроме как в соответствии с Лицензией. Вы можете получить копию Лицензии на
http://www.apache.org/licenses/LICENSE-2.0
Если это не предусмотрено действующим законодательством или не согласовано в письменном виде, программное обеспечение, распространяемое по лицензии, распространяется на основе «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО ВИДА, явных или подразумеваемых. См. Лицензию на конкретном языке, регулирующем разрешения и ограничения по Лицензии.
Настройка ButterKnife в вашем проекте
Настройте проект build.gradle
на уровне build.gradle
чтобы включить плагин android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
Затем примените плагин android-apt
в модуле build.gradle
уровне build.gradle
и добавьте зависимости ButterKnife:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Примечание. Если вы используете новый компилятор Jack с версией 2.2.0 или новее, вам не нужен плагин android-apt
и вместо него вместо apt можно использовать annotationProcessor
при объявлении зависимости компилятора.
Чтобы использовать аннотации ButterKnife, вы не должны забывать о привязке их к onCreate()
ваших действий или onCreateView()
ваших фрагментов:
class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Binding annotations
ButterKnife.bind(this);
// ...
}
}
// Or
class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(getContentView(), container, false);
// Binding annotations
ButterKnife.bind(this, view);
// ...
return view;
}
}
Снимки версии разработки доступны в репозитории снимков Sonatype .
Ниже приведены дополнительные шаги, которые необходимо предпринять для использования ButterKnife в библиотечном проекте
Чтобы использовать ButterKnife в проекте библиотеки, добавьте плагин к вашему проекту build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
... и затем применить к вашему модулю, добавив эти строки в верхней части вашего уровня библиотеки build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Теперь убедитесь, что вы используете R2
вместо R
внутри всех аннотаций ButterKnife.
class ExampleActivity extends Activity {
// Bind xml resource to their View
@BindView(R2.id.user) EditText username;
@BindView(R2.id.pass) EditText password;
// Binding resources from drawable,strings,dimens,colors
@BindString(R.string.choose) String choose;
@BindDrawable(R.drawable.send) Drawable send;
@BindColor(R.color.cyan) int cyan;
@BindDimen(R.dimen.margin) Float generalMargin;
// Listeners
@OnClick(R.id.submit)
public void submit(View view) {
// TODO submit data to server...
}
// bind with butterknife in onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// TODO continue
}
}
Связывание взглядов с использованием ButterKnife
мы можем аннотировать поля с @BindView
и идентификатором вида Butter Knife, чтобы найти и автоматически @BindView
соответствующий вид в нашем макете.
Привязки
Связывание в действии
class ExampleActivity extends Activity {
@BindView(R.id.title) TextView title;
@BindView(R.id.subtitle) TextView subtitle;
@BindView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}
Связывание в фрагментах
public class FancyFragment extends Fragment {
@BindView(R.id.button1) Button button1;
@BindView(R.id.button2) Button button2;
private Unbinder unbinder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
// in fragments or non activity bindings we need to unbind the binding when view is about to be destroyed
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
Связывание просмотров в диалогах
Мы можем использовать ButterKnife.findById
для поиска представлений в представлении, активности или диалоге. Он использует generics для вывода возвращаемого типа и автоматически выполняет бросок.
View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);
Связывание просмотров в ViewHolder
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
Ресурсы привязки
Помимо того , что полезно для связывания точки зрения, можно было бы также использовать нож для масла , чтобы связать ресурсы , такие как те , которые определены в strings.xml
, drawables.xml
, colors.xml
, dimens.xml
и т.д.
public class ExampleActivity extends Activity {
@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red; // int or ColorStateList field
@BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
ButterKnife.bind(this);
}
}
Список просмотра привязки
Вы можете группировать несколько видов в список или массив. Это очень полезно, когда нам нужно выполнить одно действие сразу для нескольких видов.
@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name })
List<EditText> nameViews;
//The apply method allows you to act on all the views in a list at once.
ButterKnife.apply(nameViews, DISABLE);
ButterKnife.apply(nameViews, ENABLED, false);
//We can use Action and Setter interfaces allow specifying simple behavior.
static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
@Override public void apply(View view, int index) {
view.setEnabled(false);
}
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
@Override public void set(View view, Boolean value, int index) {
view.setEnabled(value);
}
};
Дополнительные привязки
По умолчанию @Bind
привязки @Bind
и прослушивателя. Исключение выдается, если целевое представление не может быть найдено. Но если мы не уверены, будет ли это вид или нет, мы можем добавить @Nullable
аннотацию к полям или @Optional
аннотации методам для подавления этого поведения и создания необязательной привязки.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Связывание слушателей с использованием ButterKnife
Слушатель OnClick:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Все аргументы метода слушателя являются необязательными:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Конкретный тип будет автоматически лить:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Несколько идентификаторов в одной привязке для обработки общих событий:
@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
if (door.hasPrizeBehind()) {
Toast.makeText(this, "You win!", LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Try again", LENGTH_SHORT).show();
}
}
Пользовательские виды могут привязываться к своим собственным слушателям, не указывая идентификатор:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Несвязанные виды в ButterKnife
Фрагменты имеют иной жизненный цикл представления, чем действия. При привязке фрагмента в onCreateView задайте представления null в onDestroyView. Butter Knife возвращает экземпляр Unbinder, когда вы вызываете bind для этого. Вызовите его метод unbind в соответствующем обратном вызове жизненного цикла.
Пример:
public class MyFragment extends Fragment {
@BindView(R.id.textView) TextView textView;
@BindView(R.id.button) Button button;
private Unbinder unbinder;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
unbinder = ButterKnife.bind(this, view);
// TODO Use fields...
return view;
}
@Override public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
Примечание. Вызов unbind () в onDestroyView () не требуется, но рекомендуется, так как он сохраняет довольно немного памяти, если ваше приложение имеет большую заднюю часть.
Плагин Android Studio ButterKnife
Android ButterKnife Zelezny
Плагин для генерации инъекций ButterKnife из выбранных макетов XML в действиях / фрагментах / адаптерах.
Примечание. Убедитесь, что вы сделали правильный щелчок для your_xml_layou (R.layout.your_xml_layou
), иначе в меню Generate не будет использоваться опция форсунки Butterknife.
Ссылка: Плагин Jetbrains Android ButterKnife Zelezny