Android
Smörkniv
Sök…
Introduktion
Butterknife är ett visningsbindande verktyg som använder anteckningar för att generera pannplåtkoden för oss. Detta verktyg är utvecklat av Jake Wharton på Square och används i huvudsak för att spara att skriva repetitiva kodrader som findViewById(R.id.view)
när findViewById(R.id.view)
hanterar vyer, vilket gör att vår kod ser mycket renare ut.
För att vara tydlig är Butterknife inte ett bibliotek för beroendeinjektioner . Butterknife injicerar kod vid sammanställningstiden. Det är mycket likt det arbete som görs av Android-kommentarer.
Anmärkningar
Smörkniv
Fält- och metodbindning för Android-vyer som använder annoteringsbehandling för att generera kedelplattkod för dig.
- Eliminera findViewById-samtal med @BindView i fält.
- Gruppera flera vyer i en lista eller grupp. Använd alla dem samtidigt med åtgärder, inställare eller egenskaper.
- Eliminera anonyma innerklasser för lyssnare genom att kommentera metoder med @OnClick och andra.
- Eliminera resursuppslag genom att använda resursanteckningar på fält.
Mer info: http://jakewharton.github.io/butterknife/
Licens
Copyright 2013 Jake Wharton
Licensierad under Apache-licensen, version 2.0 ("licensen"); du får inte använda den här filen förutom i enlighet med licensen. Du kan få en kopia av licensen på
http://www.apache.org/licenses/LICENSE-2.0
Såvida det inte krävs enligt tillämplig lag eller avtalas skriftligen, distribueras programvara som distribueras under licensen på en "SOM ÄR" -BASIS, UTAN GARANTIER ELLER VILLKOR FÖR NÅGONSKAP, antingen uttryckliga eller underförstådda. Se licens för det specifika språket som reglerar behörigheter och begränsningar under licensen.
Konfigurera ButterKnife i ditt projekt
Konfigurera din build.gradle
på build.gradle
att den inkluderar build.gradle
in- android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
build.gradle
sedan plug-in- android-apt
i din build.gradle
och lägg till ButterKnife-beroenden:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Obs! Om du använder den nya Jack-kompilatorn med version 2.2.0 eller nyare behöver du inte plug-in android-apt
och kan istället ersätta apt med annotationProcessor
när du förklarar kompilatorberoendet.
För att använda ButterKnife-kommentarer bör du inte glömma att binda dem i onCreate()
av dina aktiviteter eller onCreateView()
i dina fragment:
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 av utvecklingsversionen finns tillgängliga i Sonatype's snapshots-arkiv .
Nedan följer de ytterligare stegen du måste vidta för att använda ButterKnife i ett biblioteksprojekt
Om du vill använda ButterKnife i ett biblioteksprojekt lägger du till pluginprogrammet till din build.gradle
- build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
... och applicera sedan på din modul genom att lägga till dessa rader på toppen av din biblioteksnivå build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Se till att du använder R2
istället för R
i alla ButterKnife-kommentarer.
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
}
}
Bindande vyer med ButterKnife
Vi kan kommentera fält med @BindView
och ett visnings-ID för smörkniv för att hitta och automatiskt kasta motsvarande vy i vår layout.
Bindande åsikter
Bindande åsikter i aktivitet
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...
}
}
Bindande vyer i fragment
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();
}
}
Bindande åsikter i dialoger
Vi kan använda ButterKnife.findById
att hitta vyer på en vy, aktivitet eller dialog. Den använder generiska för att dra slutsatsen om returtypen och utför automatiskt rollspel.
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);
Bindande åsikter i 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);
}
}
Bindande resurser
Bortsett från att vara användbart för bindande vyer, kan man också använda ButterKnife för att binda resurser som definieras i 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);
}
}
Bindningsvylistor
Du kan gruppera flera vyer i en lista eller array. Detta är till stor hjälp när vi behöver utföra en åtgärd på flera visningar samtidigt.
@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);
}
};
Valfri bindning
Som standard @Bind
både @Bind
och @Bind
. Ett undantag kastas om målvyn inte kan hittas. Men om vi inte är säker på om en vy kommer att finnas där eller inte så kan vi lägga till en @Nullable
kommentar till fält eller @Optional
kommentar till metoder för att undertrycka detta beteende och skapa en valfri bindning.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Binder lyssnare med ButterKnife
OnClick Listener:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Alla argument till lyssnarmetoden är valfria:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Specifik typ kommer att castas automatiskt:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Flera ID: er i en enda bindning för gemensam händelseshantering:
@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();
}
}
Anpassade visningar kan binda till sina egna lyssnare genom att inte ange ett ID:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Otroligt vyer i ButterKnife
Fragment har en annan livscykel än aktiviteter. När du binder ett fragment i onCreateView ställer du in vyerna till null i onDestroyView. Butter Knife returnerar en Unbinder-instans när du ringer bind för att göra detta åt dig. Ring sin avlindningsmetod i lämplig återuppringning av livscykeln.
Ett exempel:
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();
}
}
Obs! Det krävs inte att ringa loss () i onDestroyView (), men rekommenderas eftersom det sparar en hel del minne om din app har en stor backstack.
Android Studio ButterKnife Plugin
Android ButterKnife Zelezny
Plugin för generering av ButterKnife-injektioner från vald layout XML i aktiviteter / fragment / adaptrar.
Obs: Se till att du högerklickar för din_xml_layou (R.layout.your_xml_layou
) annars kommer menyn Generera inte att innehålla alternativet Butterknife injektor.
Länk: Jetbrains Plugin Android ButterKnife Zelezny