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.

entrer la description de l'image ici

Lien: Plugin Jetbrains Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow