Android
Buttermesser
Suche…
Einführung
Butterknife ist ein Ansichtsbindungswerkzeug, das Anmerkungen verwendet, um Boilerplate-Code für uns zu generieren. Dieses Tool wurde von Jake Wharton at Square entwickelt und dient im Wesentlichen zum Speichern von sich wiederholenden Codezeilen wie findViewById(R.id.view)
beim Umgang mit Ansichten.
Um klar zu sein, Butterknife ist keine Abhängigkeitsinjektionsbibliothek . Butterknife injiziert Code zur Kompilierzeit. Es ist der Arbeit von Android Annotations sehr ähnlich.
Bemerkungen
Buttermesser
Feld- und Methodenbindung für Android-Ansichten, in denen Anmerkungsverarbeitung verwendet wird, um für Sie Boilerplate-Code zu generieren.
- Beseitigen Sie die Aufrufe von findViewById mithilfe von @BindView für Felder.
- Gruppieren Sie mehrere Ansichten in einer Liste oder einem Array. Sie können alle Aktionen gleichzeitig mit Aktionen, Setters oder Eigenschaften ausführen.
- Beseitigen Sie anonyme Innenklassen für Zuhörer, indem Sie Methoden mit @OnClick und anderen kommentieren.
- Beseitigen Sie Ressourcensuchen, indem Sie Ressourcennotizen für Felder verwenden.
Weitere Informationen: http://jakewharton.github.io/butterknife/
Lizenz
Copyright 2013 Jake Wharton
Lizenziert unter der Apache-Lizenz, Version 2.0 (die "Lizenz"); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. Sie erhalten eine Kopie der Lizenz unter
http://www.apache.org/licenses/LICENSE-2.0
Soweit nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, wird die unter der Lizenz vertriebene Software "WIE BESEHEN", OHNE GARANTIEN ODER BEDINGUNGEN jeglicher Art, weder ausdrücklich noch stillschweigend, vertrieben. In der Lizenz finden Sie die Sprache, in der die Berechtigungen und Einschränkungen der Lizenz geregelt sind.
ButterKnife in Ihrem Projekt konfigurieren
Konfigurieren Sie Ihr build.gradle
auf build.gradle
, um das build.gradle
für android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
build.gradle
dann das android-apt
Plugin in Ihrem build.gradle
auf build.gradle
und fügen Sie die ButterKnife-Abhängigkeiten hinzu:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Hinweis: Wenn Sie den neuen Jack-Compiler mit Version 2.2.0 oder neuer verwenden, benötigen Sie das android-apt
und können stattdessen apt durch annotationProcessor
ersetzen, wenn Sie die Compilerabhängigkeit deklarieren.
Um ButterKnife-Anmerkungen zu verwenden, sollten Sie nicht vergessen, sie in onCreate()
Ihrer Aktivitäten oder onCreateView()
Ihrer Fragmente zu 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;
}
}
Snapshots der Entwicklungsversion sind im Sonatype-Repository für Snapshots verfügbar.
Nachfolgend finden Sie die zusätzlichen Schritte, die Sie ausführen müssen, um ButterKnife in einem Bibliotheksprojekt zu verwenden
Um ButterKnife in einem Bibliotheksprojekt zu verwenden, fügen Sie das Plugin zu Ihrem build.gradle
auf Projektebene build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
… Und bewerben Sie sich dann auf Ihr Modul, indem Sie diese Zeilen oben in build.gradle
Bibliotheksebene build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Stellen Sie jetzt sicher, dass Sie in allen ButterKnife-Anmerkungen R2
anstelle von R
verwenden.
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
}
}
Bindungsansichten mit ButterKnife
Wir können Felder mit @BindView
und einer Ansichts-ID für Butter Knife kommentieren, um die entsprechende Ansicht in unserem Layout zu suchen und automatisch @BindView
.
Verbindliche Ansichten
Ansichten in Aktivität binden
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...
}
}
Verbindliche Ansichten 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();
}
}
Bindungsansichten in Dialogen
Wir können ButterKnife.findById
, um Ansichten zu einer Ansicht, Aktivität oder einem Dialog zu suchen. Es verwendet Generika, um auf den Rückgabetyp zu schließen, und führt automatisch die Umwandlung durch.
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);
Bindungsansichten 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);
}
}
Bindungsressourcen
Abgesehen davon , dass die für Ansichten zu binden, könnte man auch Buttermesser verwenden , um Ressourcen zu binden , wie diejenigen , die innerhalb strings.xml
, drawables.xml
, colors.xml
, dimens.xml
usw.
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);
}
}
Bindungslisten
Sie können mehrere Ansichten in einer Liste oder einem Array zusammenfassen. Dies ist sehr hilfreich, wenn eine Aktion für mehrere Ansichten gleichzeitig ausgeführt werden muss.
@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);
}
};
Optionale Bindungen
Standardmäßig sind sowohl @Bind
als auch Listener-Bindungen erforderlich. Eine Ausnahme wird ausgelöst, wenn die Zielansicht nicht gefunden werden kann. Wenn wir jedoch nicht sicher sind, ob eine Ansicht vorhanden ist oder nicht, können wir den Feldern eine @Nullable
Annotation oder den @Optional
Annotation Methoden hinzufügen, um dieses Verhalten zu unterdrücken und eine optionale Bindung zu erstellen.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Binden von Hörern mit ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Alle Argumente für die Listener-Methode sind optional:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Spezieller Typ wird automatisch gegossen:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Mehrere IDs in einer einzigen Bindung für die Behandlung allgemeiner Ereignisse:
@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();
}
}
Benutzerdefinierte Ansichten können an ihre eigenen Listener gebunden werden, indem keine ID angegeben wird:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Unverbaubare Ansichten in ButterKnife
Fragmente haben einen anderen Ansichtslebenszyklus als Aktivitäten. Setzen Sie beim Binden eines Fragments in onCreateView die Ansichten in onDestroyView auf null. Butter Knife gibt eine Unbinder-Instanz zurück, wenn Sie bind aufrufen, um dies für Sie auszuführen. Rufen Sie seine Unbind-Methode im entsprechenden Lifecycle-Callback auf.
Ein Beispiel:
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();
}
}
Hinweis: Das Aufrufen von unbind () in onDestroyView () ist nicht erforderlich, wird jedoch empfohlen, da es viel Speicherplatz spart, wenn Ihre App einen großen Backstack hat.
Android Studio ButterKnife Plugin
Android ButterKnife Zelezny
Plugin zum Erzeugen von ButterKnife-Injektionen aus ausgewählten Layout-XMLs in Aktivitäten / Fragmenten / Adaptern.
Hinweis: Stellen Sie sicher, dass Sie mit der rechten Maustaste auf your_xml_layou (R.layout.your_xml_layou
) (R.layout.your_xml_layou
andernfalls enthält das Menü Generate keine Butterknife-Injektoroption.
Link: Jetbrains Plugin Android ButterKnife Zelezny