Szukaj…


Wprowadzenie

Butterknife to narzędzie do wiązania widoków, które korzysta z adnotacji, aby wygenerować dla nas kod bojlera. To narzędzie zostało opracowane przez Jake'a Whartona z Square i jest zasadniczo używane do zapisywania powtarzających się wierszy kodu, takich jak findViewById(R.id.view) podczas pracy z widokami, dzięki czemu nasz kod wygląda na znacznie czystszy.

Dla jasności Butterknife nie jest biblioteką wstrzykiwania zależności . Butterknife wstrzykuje kod w czasie kompilacji. Jest bardzo podobny do pracy wykonanej przez Adnotacje na Androida.

Uwagi

Nóż do masła

Powiązanie pól i metod dla widoków Androida, które korzystają z przetwarzania adnotacji w celu wygenerowania dla Ciebie kodu z podstawowymi danymi.

  • Wyeliminuj połączenia findViewById za pomocą @BindView na polach.
  • Grupuj wiele widoków w listę lub tablicę. Działaj na wszystkich z nich jednocześnie za pomocą akcji, ustawiaczy lub właściwości.
  • Wyeliminuj anonimowe klasy wewnętrzne dla słuchaczy, dodając adnotacje do metod w @OnClick i innych.
  • Wyeliminuj wyszukiwania zasobów za pomocą adnotacji zasobów na polach.

Więcej informacji: http://jakewharton.github.io/butterknife/

Licencja

Prawa autorskie 2013 Jake Wharton

Licencjonowany na licencji Apache, wersja 2.0 („Licencja”); nie możesz używać tego pliku, chyba że jest to zgodne z licencją. Możesz uzyskać kopię licencji pod adresem

http://www.apache.org/licenses/LICENSE-2.0

O ile nie wymaga tego obowiązujące prawo lub nie uzgodniono na piśmie, oprogramowanie dystrybuowane na podstawie Licencji jest dystrybuowane na zasadzie „TAK JAK JEST”, BEZ ŻADNYCH GWARANCJI ANI WARUNKÓW, wyraźnych lub dorozumianych. Zobacz licencję, aby zapoznać się z określonym językiem uprawnień i ograniczeń w ramach licencji.

Konfiguracja ButterKnife w twoim projekcie

Skonfiguruj build.gradle na poziomie projektu, aby zawierał wtyczkę android-apt :

buildscript {
   repositories {
      mavenCentral()
   }

   dependencies {
      classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
   }
}

Następnie zastosuj wtyczkę android-apt w build.gradle poziomie modułu i dodaj zależności ButterKnife:

apply plugin: 'android-apt'

android {
    ...
}

dependencies {
      compile 'com.jakewharton:butterknife:8.5.1'
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}

Uwaga: Jeśli używasz nowego kompilatora Jacka z wersją 2.2.0 lub nowszą, nie potrzebujesz wtyczki android-apt i zamiast tego możesz zamienić apt na procesor annotationProcessor podczas deklarowania zależności kompilatora.

Aby korzystać z adnotacji ButterKnife, nie należy zapominać o powiązaniu ich w onCreate() działań lub onCreateView() swoich fragmentów:

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;
  }

}

Migawki wersji rozwojowej są dostępne w repozytorium migawek Sonatype .


Poniżej znajdują się dodatkowe kroki, które należy wykonać, aby użyć ButterKnife w projekcie bibliotecznym

Aby korzystać butterknife w projekcie biblioteki dodać wtyczkę do projektu na poziomie build.gradle :

buildscript {
    dependencies {
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
    }
}

… A następnie zastosuj do swojego modułu, dodając te wiersze na górze biblioteki build.gradle :

apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'

Teraz upewnij się, że używasz R2 zamiast R we wszystkich adnotacjach 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
  }

}

Wiązanie widoków za pomocą ButterKnife

możemy @BindView adnotacje do pól za pomocą @BindView i identyfikatora widoku dla Butter Knife, aby znaleźć i automatycznie rzutować odpowiedni widok w naszym układzie.

Wiążące widoki

Wiązanie widoków w działaniu

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...
  }
}

Wiązanie widoków we fragmentach

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();
    }
}

Wiązanie widoków w oknach dialogowych

Możemy użyć ButterKnife.findById aby znaleźć widoki w Widoku, Aktywności lub Dialogu. Używa ogólnych, aby wnioskować o typie zwrotu i automatycznie wykonuje rzut.

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);

Wiązanie widoków w 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);
    }
  }

Wiążące zasoby

Oprócz bycia użytecznym dla wiązania widoki, można także użyć butterknife do wiązania zasobów, takich jak te zdefiniowane w 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);
    }

}

Wiązanie list widoków

Możesz pogrupować wiele widoków w Listę lub tablicę. Jest to bardzo pomocne, gdy musimy wykonać jedną akcję na wielu widokach jednocześnie.

@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);
  }
};

Opcjonalne wiązania

Domyślnie wymagane są zarówno powiązania @Bind , jak i nasłuchiwanie. Zgłaszany jest wyjątek, jeśli nie można znaleźć widoku docelowego. Ale jeśli nie jesteśmy pewni, czy będzie tam widok, możemy dodać adnotację @Nullable do pól lub adnotację @Optional do metod tłumienia tego zachowania i utworzenia opcjonalnego powiązania.

@Nullable 
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;

@Optional 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() {
  // TODO ...
}

Wiązanie słuchaczy za pomocą ButterKnife

OnClick Listener:

@OnClick(R.id.login)
public void login(View view) {
  // Additional logic
}

Wszystkie argumenty metody detektora są opcjonalne:

@OnClick(R.id.login)
public void login() {
   // Additional logic
}

Określony typ zostanie automatycznie rzutowany:

@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}

Wiele identyfikatorów w jednym powiązaniu do wspólnej obsługi zdarzeń:

@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();
  }
}

Widoki niestandardowe mogą łączyć się z własnymi odbiornikami, nie określając identyfikatora:

public class CustomButton extends Button {
  @OnClick
  public void onClick() {
    // TODO 
  }
}

Unbinding poglądów w ButterKnife

Fragmenty mają inny cykl życia widoku niż działania. Podczas wiązania fragmentu w onCreateView ustaw widoki na null w onDestroyView. Butter Knife zwraca instancję Unbinder, gdy wywołasz bind, aby zrobić to za Ciebie. Wywołaj jego metodę unbind w odpowiednim wywołaniu zwrotnym cyklu życia.

Przykład:

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();
  }
}

Uwaga: Wywołanie unbind () w onDestroyView () nie jest wymagane, ale zalecane, ponieważ pozwala zaoszczędzić sporo pamięci, jeśli twoja aplikacja ma duży backstack.

Wtyczka ButterKnife dla Androida Studio

Android ButterKnife Zelezny

Wtyczka do generowania zastrzyków ButterKnife z wybranych plików XML układu w działaniach / fragmentach / adapterach.

Uwaga: Upewnij się, że wykonałeś kliknięcie prawym przyciskiem myszy dla twojej_xml_layou (R.layout.your_xml_layou ), w przeciwnym razie menu Generuj nie będzie zawierało opcji wtryskiwacza Butterknife.

wprowadź opis zdjęcia tutaj

Link: Jetbrains Plugin Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow