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

ange bildbeskrivning här

Länk: Jetbrains Plugin Android ButterKnife Zelezny



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow