2014-02-17 5 views
13

Zeit zu injizieren:butter Mit einer Reihe von Ansichten

ImageView activityImageViews[] = { 
    (ImageView) rootView.findViewById(R.id.img_activity_1), 
    (ImageView) rootView.findViewById(R.id.img_activity_2), 
    (ImageView) rootView.findViewById(R.id.img_activity_3), 
    (ImageView) rootView.findViewById(R.id.img_activity_4) 
}; 

Gibt es eine Möglichkeit, ich butter all diese Ansichten zu injizieren verwenden könnte? Ich muss sie in einem Array (oder in einer Weise, damit ich über sie iterieren kann).

+0

Gerade stolperte vor kurzem auf Buttermesser so weiß nicht, ob es das direkt unterstützt, aber warum nicht nur einzeln injizieren und sie in einem Array sammeln oder eine Liste innerhalb onCreate? – cYrixmorten

Antwort

39

Derzeit ist es möglich, mehrere Ansichten als Array zu injizieren.

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

UPDATE 2017.09.19: Seit Version Version 7.0.0 (2015-06-27) butter @Bind ersetzt @InjectView und @InjectViews Von butter documentation

@InjectViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) 
List<EditText> nameViews; 

Das Gleiche gilt für mehrere Klick-Hörer (Abschnitt VIEW LISTEN sehen). Aber seit Version Version 8.0.0 (2016-04-25)@Bind wurde mit @BindView und @BindViews für eine Ansicht bzw. mehrere Ansichten ersetzt. Also für kennen die korrekte Syntax ist:

@BindView(R.id.button1) Button button1; 
@BindView(R.id.button2) Button button2; 

@BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) 
List<EditText> nameViews; 
+1

Cool! Obwohl ich nicht mehr an diesem Projekt arbeite, ist es gut, es für zukünftige Referenzen zu wissen, danke also :) – aluxian

2

Ich nehme an, dass die Elemente zum Array dynamisch hinzugefügt werden, sonst kann man sie einfach eins nach dem anderen in Ihrem Header deklarieren und anschließend fügen Sie sie in das Array:

// in the header: 
@InjectView(R.id.imageview1) ImageView imageView1; 
@InjectView(R.id.imageview2) ImageView imageView2; 
@InjectView(R.id.imageview3) ImageView imageView3; 

// inside your code: 
ImageView activityImageViews[] = { 
    imageView1, imageView2, imageView3 
}; 

Aber wie auch immer, wenn die Elemente dynamisch (in der Anzahl der Elemente/ID der Elemente etc.) das einzige, was Sie tun können, ist ButterKnife.findById zu verwenden, was die ImageView Umwandlung vermeidet - Sie können sie nicht über Annotation injizieren, weil Butterknife nicht weiß, was Sie beim Kompilieren generieren/injizieren müssen Zeit (die Information ist erst zur Laufzeit verfügbar).

ImageView activityImageViews[] = { 
    ButterKnife.findById(view, R.id.img_activity_1), 
    ButterKnife.findById(view, R.id.img_activity_2), 
    ButterKnife.findById(view, R.id.img_activity_3), 
    ButterKnife.findById(view, R.id.img_activity_4) 
}; 
+0

Das zweite Snippet gibt _Incompatible types. Erforderlich: android.widget.ImageView, Gefunden: android.view.View_. Ich werde deine erste Annäherung benutzen, danke! – aluxian

+0

Hmm, das ist seltsam. Ich benutze ButterKnife 4.0.1 und auch der zweite Ansatz funktioniert gut für mich. Die Dokumentation sagt '[...] Es verwendet Generics, um den Rückgabetyp abzuleiten und führt den Cast automatisch aus. – Flixer

Verwandte Themen