Zoeken…


Invoering

Butterknife is een view binding tool die annotaties gebruikt om boilerplate-code voor ons te genereren. Deze tool is ontwikkeld door Jake Wharton op Square en wordt in wezen gebruikt om het typen van repetitieve coderegels zoals findViewById(R.id.view) bij het omgaan met views, waardoor onze code er een stuk schoner uitziet.

Voor alle duidelijkheid, Butterknife is geen bibliotheek voor afhankelijkheidsinjectie . Butterknife injecteert code tijdens het compileren. Het lijkt erg op het werk van Android Annotations.

Opmerkingen

Botermes

Veld- en methodebinding voor Android-weergaven die annotatieverwerking gebruiken om boilerplate-code voor u te genereren.

  • Elimineer findViewById-oproepen met @BindView op velden.
  • Groepeer meerdere weergaven in een lijst of array. Bewerk ze allemaal tegelijk met acties, setters of eigenschappen.
  • Elimineer anonieme binnenklassen voor luisteraars door methoden te annoteren met @OnClick en anderen.
  • Elimineer het opzoeken van bronnen door middel van annotaties van bronnen op velden.

Meer info: http://jakewharton.github.io/butterknife/

Licentie

Copyright 2013 Jake Wharton

Gelicentieerd onder de Apache-licentie, versie 2.0 (de "Licentie"); u mag dit bestand niet gebruiken behalve in overeenstemming met de Licentie. U kunt een kopie van de Licentie verkrijgen op

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

Tenzij vereist door toepasselijke wetgeving of schriftelijk overeengekomen, wordt software die onder de Licentie wordt gedistribueerd gedistribueerd op een "AS IS" BASIS, ZONDER ENIGE GARANTIES OF VOORWAARDEN, expliciet of impliciet. Zie de Licentie voor de specifieke taal die de toestemmingen en beperkingen onder de Licentie beheerst.

ButterKnife in uw project configureren

Configureer uw build.gradle op build.gradle met de plug android-apt :

buildscript {
   repositories {
      mavenCentral()
   }

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

build.gradle vervolgens de plug-in android-apt in uw build.gradle en voeg de afhankelijkheden van ButterKnife toe:

apply plugin: 'android-apt'

android {
    ...
}

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

Opmerking: Als u de nieuwe Jack-compiler met versie 2.2.0 of nieuwer gebruikt, hebt u de plug android-apt niet nodig en kunt u apt vervangen door annotationProcessor wanneer u de afhankelijkheid van de compiler aangeeft.

Om annotaties van ButterKnife te gebruiken, moet u niet vergeten ze te binden in onCreate() van uw activiteiten of onCreateView() van uw fragmenten:

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 van de ontwikkelingsversie zijn beschikbaar in de snapshotsrepository van Sonatype .


Hieronder staan de extra stappen die u moet nemen om ButterKnife in een bibliotheekproject te gebruiken

Om ButterKnife in een bibliotheekproject te gebruiken, voegt u de plug-in toe aan uw build.gradle :

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

... en vervolgens van toepassing zijn op uw module door deze regels toe te voegen aan de bovenkant van uw build.gradle bibliotheekniveau:

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

Zorg er nu voor dat u R2 plaats van R in alle annotaties van 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
  }

}

Bindende weergaven met ButterKnife

we kunnen aantekeningen maken op velden met @BindView en een weergave-ID voor Butter Knife om de bijbehorende weergave in onze lay-out te vinden en automatisch te casten.

Bindende weergaven

Bindende weergaven in activiteit

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

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

Bindende weergaven in dialoogvensters

We kunnen ButterKnife.findById gebruiken om weergaven te vinden in een weergave, activiteit of dialoogvenster. Het gebruikt generieke middelen om het retourtype te bepalen en voert automatisch de cast uit.

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

Bindende weergaven 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);
    }
  }

Bindende middelen

Afgezien van het feit bruikbaar voor het binden van uitzicht, kan men ook butterknife gebruiken om bind middelen, zoals die gedefinieerd binnen 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);
    }

}

Bindende kijklijsten

U kunt meerdere weergaven groeperen in een lijst of array. Dit is erg handig wanneer we één actie op meerdere weergaven tegelijk moeten uitvoeren.

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

Optionele bindingen

Standaard zijn zowel @Bind als luisteraarbindingen vereist. Er wordt een uitzondering gegenereerd als de doelweergave niet kan worden gevonden. Maar als we niet zeker weten of een weergave er wel of niet is, kunnen we een @Nullable annotatie toevoegen aan velden of de @Optional annotatie aan methoden om dit gedrag te onderdrukken en een optionele binding maken.

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

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

Bindende luisteraars met ButterKnife

OnClick Listener:

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

Alle argumenten voor de luisteraarmethode zijn optioneel:

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

Specifiek type wordt automatisch gegoten:

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

Meerdere ID's in één binding voor algemene gebeurtenisafhandeling:

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

Aangepaste weergaven kunnen binden aan hun eigen luisteraars door geen ID op te geven:

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

Vrijblijvende weergaven in ButterKnife

Fragmenten hebben een andere kijklevenscyclus dan activiteiten. Wanneer u een fragment bindt in onCreateView, stelt u de weergaven in op nul in onDestroyView. Butter Knife retourneert een Unbinder-exemplaar wanneer u bind aanroept om dit voor u te doen. Roep de ongebonden methode aan in de juiste call voor de levenscyclus.

Een voorbeeld:

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

Opmerking: het aanroepen van unbind () in onDestroyView () is niet vereist, maar wordt wel aanbevolen omdat het behoorlijk wat geheugen bespaart als uw app een grote backstack heeft.

Android Studio ButterKnife-plug-in

Android ButterKnife Zelezny

Plug-in voor het genereren van ButterKnife-injecties van geselecteerde lay-out-XML's in activiteiten / fragmenten / adapters.

Opmerking: zorg ervoor dat u de juiste klik maakt voor uw_xml_layou (R.layout.your_xml_layou ), anders bevat het menu Genereren geen optie Butterknife injector.

voer hier de afbeeldingsbeschrijving in

Link: Jetbrains Plugin Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow