Android
Nóż do masła
Szukaj…
Wprowadzenie
Butterknife to narzędzie do wiązania widoków, które korzysta z adnotacji, aby wygenerować dla nas kod bojlera. To narzędzie zostało opracowane przez Jake'a Whartona z Square i jest zasadniczo używane do zapisywania powtarzających się wierszy kodu, takich jak findViewById(R.id.view)
podczas pracy z widokami, dzięki czemu nasz kod wygląda na znacznie czystszy.
Dla jasności Butterknife nie jest biblioteką wstrzykiwania zależności . Butterknife wstrzykuje kod w czasie kompilacji. Jest bardzo podobny do pracy wykonanej przez Adnotacje na Androida.
Uwagi
Nóż do masła
Powiązanie pól i metod dla widoków Androida, które korzystają z przetwarzania adnotacji w celu wygenerowania dla Ciebie kodu z podstawowymi danymi.
- Wyeliminuj połączenia findViewById za pomocą @BindView na polach.
- Grupuj wiele widoków w listę lub tablicę. Działaj na wszystkich z nich jednocześnie za pomocą akcji, ustawiaczy lub właściwości.
- Wyeliminuj anonimowe klasy wewnętrzne dla słuchaczy, dodając adnotacje do metod w @OnClick i innych.
- Wyeliminuj wyszukiwania zasobów za pomocą adnotacji zasobów na polach.
Więcej informacji: http://jakewharton.github.io/butterknife/
Licencja
Prawa autorskie 2013 Jake Wharton
Licencjonowany na licencji Apache, wersja 2.0 („Licencja”); nie możesz używać tego pliku, chyba że jest to zgodne z licencją. Możesz uzyskać kopię licencji pod adresem
http://www.apache.org/licenses/LICENSE-2.0
O ile nie wymaga tego obowiązujące prawo lub nie uzgodniono na piśmie, oprogramowanie dystrybuowane na podstawie Licencji jest dystrybuowane na zasadzie „TAK JAK JEST”, BEZ ŻADNYCH GWARANCJI ANI WARUNKÓW, wyraźnych lub dorozumianych. Zobacz licencję, aby zapoznać się z określonym językiem uprawnień i ograniczeń w ramach licencji.
Konfiguracja ButterKnife w twoim projekcie
Skonfiguruj build.gradle
na poziomie projektu, aby zawierał wtyczkę android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
Następnie zastosuj wtyczkę android-apt
w build.gradle
poziomie modułu i dodaj zależności ButterKnife:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Uwaga: Jeśli używasz nowego kompilatora Jacka z wersją 2.2.0 lub nowszą, nie potrzebujesz wtyczki android-apt
i zamiast tego możesz zamienić apt na procesor annotationProcessor
podczas deklarowania zależności kompilatora.
Aby korzystać z adnotacji ButterKnife, nie należy zapominać o powiązaniu ich w onCreate()
działań lub onCreateView()
swoich fragmentów:
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;
}
}
Migawki wersji rozwojowej są dostępne w repozytorium migawek Sonatype .
Poniżej znajdują się dodatkowe kroki, które należy wykonać, aby użyć ButterKnife w projekcie bibliotecznym
Aby korzystać butterknife w projekcie biblioteki dodać wtyczkę do projektu na poziomie build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
… A następnie zastosuj do swojego modułu, dodając te wiersze na górze biblioteki build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Teraz upewnij się, że używasz R2
zamiast R
we wszystkich adnotacjach 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
}
}
Wiązanie widoków za pomocą ButterKnife
możemy @BindView
adnotacje do pól za pomocą @BindView
i identyfikatora widoku dla Butter Knife, aby znaleźć i automatycznie rzutować odpowiedni widok w naszym układzie.
Wiążące widoki
Wiązanie widoków w działaniu
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...
}
}
Wiązanie widoków we fragmentach
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();
}
}
Wiązanie widoków w oknach dialogowych
Możemy użyć ButterKnife.findById
aby znaleźć widoki w Widoku, Aktywności lub Dialogu. Używa ogólnych, aby wnioskować o typie zwrotu i automatycznie wykonuje rzut.
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);
Wiązanie widoków w 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);
}
}
Wiążące zasoby
Oprócz bycia użytecznym dla wiązania widoki, można także użyć butterknife do wiązania zasobów, takich jak te zdefiniowane w strings.xml
, drawables.xml
, colors.xml
, dimens.xml
, etc.
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);
}
}
Wiązanie list widoków
Możesz pogrupować wiele widoków w Listę lub tablicę. Jest to bardzo pomocne, gdy musimy wykonać jedną akcję na wielu widokach jednocześnie.
@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);
}
};
Opcjonalne wiązania
Domyślnie wymagane są zarówno powiązania @Bind
, jak i nasłuchiwanie. Zgłaszany jest wyjątek, jeśli nie można znaleźć widoku docelowego. Ale jeśli nie jesteśmy pewni, czy będzie tam widok, możemy dodać adnotację @Nullable
do pól lub adnotację @Optional
do metod tłumienia tego zachowania i utworzenia opcjonalnego powiązania.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Wiązanie słuchaczy za pomocą ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Wszystkie argumenty metody detektora są opcjonalne:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Określony typ zostanie automatycznie rzutowany:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Wiele identyfikatorów w jednym powiązaniu do wspólnej obsługi zdarzeń:
@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();
}
}
Widoki niestandardowe mogą łączyć się z własnymi odbiornikami, nie określając identyfikatora:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Unbinding poglądów w ButterKnife
Fragmenty mają inny cykl życia widoku niż działania. Podczas wiązania fragmentu w onCreateView ustaw widoki na null w onDestroyView. Butter Knife zwraca instancję Unbinder, gdy wywołasz bind, aby zrobić to za Ciebie. Wywołaj jego metodę unbind w odpowiednim wywołaniu zwrotnym cyklu życia.
Przykład:
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();
}
}
Uwaga: Wywołanie unbind () w onDestroyView () nie jest wymagane, ale zalecane, ponieważ pozwala zaoszczędzić sporo pamięci, jeśli twoja aplikacja ma duży backstack.
Wtyczka ButterKnife dla Androida Studio
Android ButterKnife Zelezny
Wtyczka do generowania zastrzyków ButterKnife z wybranych plików XML układu w działaniach / fragmentach / adapterach.
Uwaga: Upewnij się, że wykonałeś kliknięcie prawym przyciskiem myszy dla twojej_xml_layou (R.layout.your_xml_layou
), w przeciwnym razie menu Generuj nie będzie zawierało opcji wtryskiwacza Butterknife.
Link: Jetbrains Plugin Android ButterKnife Zelezny