Android
Coltello da burro
Ricerca…
introduzione
Butterknife è uno strumento di associazione delle viste che utilizza le annotazioni per generare il codice boilerplate per noi. Questo strumento è stato sviluppato da Jake Wharton in Square ed è essenzialmente utilizzato per risparmiare la digitazione di righe ripetitive di codice come findViewById(R.id.view)
quando si tratta di visualizzazioni, rendendo il nostro codice molto più pulito.
Per essere chiari, Butterknife non è una libreria di dipendenze . Butterknife inietta il codice al momento della compilazione. È molto simile al lavoro svolto da Android Annotations.
Osservazioni
Coltello da burro
Associazione dei campi e dei metodi per le viste Android che utilizza l'elaborazione delle annotazioni per generare automaticamente il codice di zona.
- Elimina le chiamate findViewById utilizzando @BindView nei campi.
- Raggruppa più viste in un elenco o array. Operare su tutti contemporaneamente con azioni, setter o proprietà.
- Elimina le inner class anonime per gli ascoltatori annotando i metodi con @OnClick e altri.
- Elimina le ricerche di risorse utilizzando annotazioni di risorse sui campi.
Maggiori informazioni: http://jakewharton.github.io/butterknife/
Licenza
Copyright 2013 Jake Wharton
Autorizzato con Licenza Apache, Versione 2.0 (la "Licenza"); non è possibile utilizzare questo file se non in conformità con la licenza. È possibile ottenere una copia della licenza all'indirizzo
http://www.apache.org/licenses/LICENSE-2.0
Salvo quanto richiesto dalla legge applicabile o concordato per iscritto, il software distribuito sotto la Licenza è distribuito "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, espresse o implicite. Vedere la Licenza per le autorizzazioni e limitazioni specifiche della lingua che disciplinano la Licenza.
Configurare ButterKnife nel tuo progetto
Configura il tuo build.gradle
a livello di build.gradle
per includere il plugin per android-apt
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
Quindi, applica il plugin per android-apt
nel build.gradle
livello di build.gradle
e aggiungi le dipendenze di ButterKnife:
apply plugin: 'android-apt'
android {
...
}
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
Nota: se stai usando il nuovo compilatore Jack con la versione 2.2.0 o più recente non hai bisogno del plugin per android-apt
e puoi invece sostituire apt con annotationProcessor
quando dichiari la dipendenza del compilatore.
Per utilizzare le annotazioni di ButterKnife, non dimenticare di onCreate()
in onCreate()
delle tue attività o onCreateView()
dei tuoi frammenti:
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;
}
}
Le istantanee della versione di sviluppo sono disponibili nel repository di istantanee di Sonatype .
Di seguito sono riportati i passaggi aggiuntivi che dovresti fare per utilizzare ButterKnife in un progetto di libreria
Per usare ButterKnife in un progetto di libreria, aggiungi il plugin al tuo build.gradle
livello di build.gradle
:
buildscript {
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
... e poi applica al tuo modulo aggiungendo queste righe nella parte superiore del tuo livello di libreria build.gradle
:
apply plugin: 'com.android.library'
// ...
apply plugin: 'com.jakewharton.butterknife'
Ora assicurati di usare R2
invece di R
all'interno di tutte le annotazioni 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
}
}
Visualizzazioni vincolanti con ButterKnife
possiamo annotare campi con @BindView
e un ID vista per Butter Knife per trovare e lanciare automaticamente la vista corrispondente nel nostro layout.
Visualizzazioni vincolanti
Visualizzazioni vincolanti in attività
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...
}
}
Viste vincolanti in frammenti
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();
}
}
Visualizzazioni vincolanti nelle finestre di dialogo
Possiamo usare ButterKnife.findById
per trovare viste su una vista, attività o finestra di dialogo. Usa i generici per inferire il tipo di ritorno e esegue automaticamente il cast.
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);
Visualizzazioni vincolanti 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);
}
}
Risorse vincolanti
Oltre ad essere utile per le viste vincolanti, è possibile utilizzare ButterKnife per associare risorse come quelle definite all'interno di strings.xml
, drawables.xml
, colors.xml
, dimens.xml
, ecc.
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);
}
}
Elenchi di vista vincolanti
È possibile raggruppare più viste in un elenco o array. Questo è molto utile quando è necessario eseguire un'azione su più viste contemporaneamente.
@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);
}
};
Attacchi opzionali
Per impostazione predefinita, sono richiesti entrambi i binding di @Bind
e listener. Viene generata un'eccezione se non è possibile trovare la vista di destinazione. Ma se non siamo sicuri che una vista sarà presente o meno, possiamo aggiungere un'annotazione @Nullable
ai campi o l'annotazione @Optional
ai metodi per sopprimere questo comportamento e creare un'associazione facoltativa.
@Nullable
@BindView(R.id.might_not_be_there) TextView mightNotBeThere;
@Optional
@OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {
// TODO ...
}
Ascoltatori vincolanti con ButterKnife
Listener di OnClick:
@OnClick(R.id.login)
public void login(View view) {
// Additional logic
}
Tutti gli argomenti del metodo listener sono facoltativi:
@OnClick(R.id.login)
public void login() {
// Additional logic
}
Il tipo specifico verrà automaticamente castato:
@OnClick(R.id.submit)
public void sayHi(Button button) {
button.setText("Hello!");
}
Più ID in un singolo binding per la gestione di eventi comuni:
@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();
}
}
Le viste personalizzate possono associarsi ai propri ascoltatori non specificando un ID:
public class CustomButton extends Button {
@OnClick
public void onClick() {
// TODO
}
}
Visualizzazioni non vincenti in ButterKnife
I frammenti hanno un ciclo di vita di visualizzazione diverso rispetto alle attività. Quando si associa un frammento in onCreateView, impostare le viste su null in onDestroyView. Butter Knife restituisce un'istanza di Unbinder quando chiami bind per farlo per te. Chiamare il metodo unbind nel callback del ciclo di vita appropriato.
Un esempio:
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();
}
}
Nota: la chiamata di unbind () in onDestroyView () non è richiesta, ma è consigliata in quanto consente di risparmiare un bel po 'di memoria se l'app ha un backstack di grandi dimensioni.
Android Studio ButterKnife Plugin
Android ButterKnife Zelezny
Plugin per generare iniezioni ButterKnife da XML di layout selezionati in attività / frammenti / adattatori.
Nota: assicurati di fare clic con il pulsante destro del mouse su your_xml_layou (R.layout.your_xml_layou
) altrimenti il menu Genera non conterrà l'opzione Iniettore Butterknife.
Link: Plugin Jetbrains Android ButterKnife Zelezny