Android
Couteau à beurre
Recherche…
Introduction
Butterknife est un outil de liaison de vues qui utilise des annotations pour générer du code standard pour nous. Cet outil est développé par Jake Wharton à Square et est essentiellement utilisé pour enregistrer des lignes de code répétitives telles que findViewById(R.id.view)
lorsqu’il s’agit de vues, rendant ainsi notre code beaucoup plus propre.
Pour être clair, Butterknife n'est pas une bibliothèque d'injection de dépendance . Butterknife injecte du code au moment de la compilation. Il est très similaire au travail effectué par les annotations Android.
Remarques
Couteau à beurre
Liaison de champs et de méthodes pour les vues Android qui utilise le traitement des annotations pour générer du code standard pour vous.
- Éliminez les appels à findViewById en utilisant @BindView sur les champs.
- Regrouper plusieurs vues dans une liste ou un tableau. Utilisez-les tous en même temps avec des actions, des paramètres ou des propriétés.
- Éliminez les classes internes anonymes pour les auditeurs en annotant les méthodes avec @OnClick et autres.
- Éliminez les recherches de ressources en utilisant les annotations de ressources sur les champs.
Plus d'infos: http://jakewharton.github.io/butterknife/
Licence
Copyright 2013 Jake Wharton
Licence sous la licence Apache, version 2.0 (la "licence"); vous ne pouvez utiliser ce fichier que conformément à la licence. Vous pouvez obtenir une copie de la licence à
http://www.apache.org/licenses/LICENSE-2.0
Sauf si requis par la loi applicable ou convenu par écrit, les logiciels distribués sous la Licence sont distribués "TELS QUELS", SANS GARANTIE OU CONDITION D'AUCUNE SORTE, expresse ou implicite. Reportez-vous à la licence pour connaître la langue spécifique régissant les autorisations et les limitations sous la licence.
Configurer ButterKnife dans votre projet
Configurez votre build.gradle
au niveau du build.gradle
pour inclure le plugin android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
Ensuite, appliquez le plugin android-apt
dans votre build.gradle
niveau du build.gradle
et ajoutez les dépendances ButterKnife:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Note: Si vous utilisez le nouveau compilateur Jack avec la version 2.2.0 ou plus récente, vous n'avez pas besoin du plug android-apt
in android-apt
et vous pouvez remplacer apt par annotationProcessor
lors de la déclaration de la dépendance du compilateur.
Pour utiliser les annotations ButterKnife, vous ne devez pas oublier de les lier dans onCreate()
de vos activités ou onCreateView()
de vos fragments:
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;
}
}
Les instantanés de la version de développement sont disponibles dans le référentiel d'instantanés de Sonatype .
Vous trouverez ci-dessous les étapes supplémentaires à suivre pour utiliser ButterKnife dans un projet de bibliothèque.
Pour utiliser ButterKnife dans un projet de bibliothèque, ajoutez le plug-in à votre build.gradle
niveau du build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
… Et ensuite appliquer à votre module en ajoutant ces lignes en haut de votre build.gradle
niveau de la build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Maintenant, assurez-vous d'utiliser R2
au lieu de R
dans toutes les annotations 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
}
}
Vues contraignantes à l'aide de ButterKnife
Nous pouvons annoter les champs avec @BindView
et un identifiant de vue pour Butter Knife pour trouver et afficher automatiquement la vue correspondante dans notre présentation.
Vues contraignantes
Relier les vues dans l'activité
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...
}
}
Vues contraignantes dans les fragments
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();
}
}
Vues de liaison dans les dialogues
Nous pouvons utiliser ButterKnife.findById
pour rechercher des vues sur une vue, une activité ou une boîte de dialogue. Il utilise des génériques pour déduire le type de retour et effectue automatiquement la conversion.
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);
Vues de liaison dans 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);
}
}
Ressources contraignantes
En plus d'être utile pour les vues de liaison, vous pouvez également utiliser ButterKnife pour lier des ressources telles que celles définies dans 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);
}
}
Listes de vue de reliure
Vous pouvez regrouper plusieurs vues dans une liste ou un tableau. Ceci est très utile lorsque vous devez effectuer une action sur plusieurs vues à la fois.
@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);
}
};
Fixations optionnelles
Par défaut, les @Bind
et listener sont requises. Une exception est levée si la vue cible est introuvable. Mais si nous ne sommes pas sûrs qu'une vue soit présente ou non, nous pouvons ajouter une annotation @Nullable
aux champs ou @Optional
annotation @Optional
aux méthodes permettant de supprimer ce comportement et créer une liaison facultative.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Relier les auditeurs à l'aide de ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Tous les arguments de la méthode écouteur sont facultatifs:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Le type spécifique sera automatiquement lancé:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Plusieurs ID dans une seule liaison pour la gestion des événements communs:
@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();
}
}
Les vues personnalisées peuvent se lier à leurs propres écouteurs en ne spécifiant pas d'ID:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Des vues indomptables dans ButterKnife
Les fragments ont un cycle de vie différent des activités. Lors de la liaison d'un fragment dans onCreateView, définissez les vues sur null dans onDestroyView. Butter Knife renvoie une instance Unbinder lorsque vous appelez bind pour le faire pour vous. Appelez sa méthode de détachement dans le rappel de cycle de vie approprié.
Un exemple:
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();
}
}
Remarque: L'appel de unbind () dans onDestroyView () n'est pas obligatoire, mais recommandé car il permet d'économiser un peu de mémoire si votre application présente un important backstack.
Android Studio ButterKnife Plugin
Android ButterKnife Zelezny
Plugin pour générer des injections ButterKnife à partir de XML de disposition sélectionnés dans des activités / fragments / adaptateurs.
Remarque: Assurez-vous de faire un clic droit sur votre_xml_layou (R.layout.your_xml_layou
), sinon le menu Générer ne contiendra pas d'option d'injecteur Butterknife.
Lien: Plugin Jetbrains Android ButterKnife Zelezny