Android
Botermes
Zoeken…
Invoering
Butterknife is een view binding tool die annotaties gebruikt om boilerplate-code voor ons te genereren. Deze tool is ontwikkeld door Jake Wharton op Square en wordt in wezen gebruikt om het typen van repetitieve coderegels zoals findViewById(R.id.view)
bij het omgaan met views, waardoor onze code er een stuk schoner uitziet.
Voor alle duidelijkheid, Butterknife is geen bibliotheek voor afhankelijkheidsinjectie . Butterknife injecteert code tijdens het compileren. Het lijkt erg op het werk van Android Annotations.
Opmerkingen
Botermes
Veld- en methodebinding voor Android-weergaven die annotatieverwerking gebruiken om boilerplate-code voor u te genereren.
- Elimineer findViewById-oproepen met @BindView op velden.
- Groepeer meerdere weergaven in een lijst of array. Bewerk ze allemaal tegelijk met acties, setters of eigenschappen.
- Elimineer anonieme binnenklassen voor luisteraars door methoden te annoteren met @OnClick en anderen.
- Elimineer het opzoeken van bronnen door middel van annotaties van bronnen op velden.
Meer info: http://jakewharton.github.io/butterknife/
Licentie
Copyright 2013 Jake Wharton
Gelicentieerd onder de Apache-licentie, versie 2.0 (de "Licentie"); u mag dit bestand niet gebruiken behalve in overeenstemming met de Licentie. U kunt een kopie van de Licentie verkrijgen op
http://www.apache.org/licenses/LICENSE-2.0
Tenzij vereist door toepasselijke wetgeving of schriftelijk overeengekomen, wordt software die onder de Licentie wordt gedistribueerd gedistribueerd op een "AS IS" BASIS, ZONDER ENIGE GARANTIES OF VOORWAARDEN, expliciet of impliciet. Zie de Licentie voor de specifieke taal die de toestemmingen en beperkingen onder de Licentie beheerst.
ButterKnife in uw project configureren
Configureer uw build.gradle
op build.gradle
met de plug android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
build.gradle
vervolgens de plug-in android-apt
in uw build.gradle
en voeg de afhankelijkheden van ButterKnife toe:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Opmerking: Als u de nieuwe Jack-compiler met versie 2.2.0 of nieuwer gebruikt, hebt u de plug android-apt
niet nodig en kunt u apt vervangen door annotationProcessor
wanneer u de afhankelijkheid van de compiler aangeeft.
Om annotaties van ButterKnife te gebruiken, moet u niet vergeten ze te binden in onCreate()
van uw activiteiten of onCreateView()
van uw fragmenten:
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;
}
}
Snapshots van de ontwikkelingsversie zijn beschikbaar in de snapshotsrepository van Sonatype .
Hieronder staan de extra stappen die u moet nemen om ButterKnife in een bibliotheekproject te gebruiken
Om ButterKnife in een bibliotheekproject te gebruiken, voegt u de plug-in toe aan uw build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
... en vervolgens van toepassing zijn op uw module door deze regels toe te voegen aan de bovenkant van uw build.gradle
bibliotheekniveau:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Zorg er nu voor dat u R2
plaats van R
in alle annotaties van 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
}
}
Bindende weergaven met ButterKnife
we kunnen aantekeningen maken op velden met @BindView
en een weergave-ID voor Butter Knife om de bijbehorende weergave in onze lay-out te vinden en automatisch te casten.
Bindende weergaven
Bindende weergaven in activiteit
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...
}
}
Bindende weergaven in fragmenten
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();
}
}
Bindende weergaven in dialoogvensters
We kunnen ButterKnife.findById
gebruiken om weergaven te vinden in een weergave, activiteit of dialoogvenster. Het gebruikt generieke middelen om het retourtype te bepalen en voert automatisch de cast uit.
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);
Bindende weergaven in 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);
}
}
Bindende middelen
Afgezien van het feit bruikbaar voor het binden van uitzicht, kan men ook butterknife gebruiken om bind middelen, zoals die gedefinieerd binnen 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);
}
}
Bindende kijklijsten
U kunt meerdere weergaven groeperen in een lijst of array. Dit is erg handig wanneer we één actie op meerdere weergaven tegelijk moeten uitvoeren.
@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);
}
};
Optionele bindingen
Standaard zijn zowel @Bind
als luisteraarbindingen vereist. Er wordt een uitzondering gegenereerd als de doelweergave niet kan worden gevonden. Maar als we niet zeker weten of een weergave er wel of niet is, kunnen we een @Nullable
annotatie toevoegen aan velden of de @Optional
annotatie aan methoden om dit gedrag te onderdrukken en een optionele binding maken.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Bindende luisteraars met ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Alle argumenten voor de luisteraarmethode zijn optioneel:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Specifiek type wordt automatisch gegoten:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Meerdere ID's in één binding voor algemene gebeurtenisafhandeling:
@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();
}
}
Aangepaste weergaven kunnen binden aan hun eigen luisteraars door geen ID op te geven:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Vrijblijvende weergaven in ButterKnife
Fragmenten hebben een andere kijklevenscyclus dan activiteiten. Wanneer u een fragment bindt in onCreateView, stelt u de weergaven in op nul in onDestroyView. Butter Knife retourneert een Unbinder-exemplaar wanneer u bind aanroept om dit voor u te doen. Roep de ongebonden methode aan in de juiste call voor de levenscyclus.
Een voorbeeld:
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();
}
}
Opmerking: het aanroepen van unbind () in onDestroyView () is niet vereist, maar wordt wel aanbevolen omdat het behoorlijk wat geheugen bespaart als uw app een grote backstack heeft.
Android Studio ButterKnife-plug-in
Android ButterKnife Zelezny
Plug-in voor het genereren van ButterKnife-injecties van geselecteerde lay-out-XML's in activiteiten / fragmenten / adapters.
Opmerking: zorg ervoor dat u de juiste klik maakt voor uw_xml_layou (R.layout.your_xml_layou
), anders bevat het menu Genereren geen optie Butterknife injector.
Link: Jetbrains Plugin Android ButterKnife Zelezny