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

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.

inserisci la descrizione dell'immagine qui

Link: Plugin Jetbrains Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow