Reputation: 43
I need to declare multiple ImageViews with a similair name scheme. I was wondering if there's a way of doing this without a separate line of code for every variable. Right now i'm doing it like this:
ImageView letterView1 = (ImageView) this.findViewById(R.id.letter1);
ImageView letterView2 = (ImageView) this.findViewById(R.id.letter2);
ImageView letterView3 = (ImageView) this.findViewById(R.id.letter3);
ImageView letterView4 = (ImageView) this.findViewById(R.id.letter4);
ImageView letterView5 = (ImageView) this.findViewById(R.id.letter5);
ImageView letterView6 = (ImageView) this.findViewById(R.id.letter6);
ImageView letterView7 = (ImageView) this.findViewById(R.id.letter7);
ImageView letterView8 = (ImageView) this.findViewById(R.id.letter8);
ImageView letterView9 = (ImageView) this.findViewById(R.id.letter9);
ImageView letterView10 = (ImageView) this.findViewById(R.id.letter10);
ImageView letterView11 = (ImageView) this.findViewById(R.id.letter11);
ImageView letterView12 = (ImageView) this.findViewById(R.id.letter12);
ImageView letterView13 = (ImageView) this.findViewById(R.id.letter13);
ImageView letterView14 = (ImageView) this.findViewById(R.id.letter14);
Upvotes: 0
Views: 66
Reputation: 12744
If you need a key on every ImageView
you can also using a map.
Map<Integer, ImageView> map = new HashMap<>();
for ( int i = 0; i < 14; i++){
map.put(i, (ImageView) this.findViewById("R.id.letter" + (i+1)));
}
And you get your ImageView
by key:
ImageView imageView = map.get(1);
Upvotes: 0
Reputation: 2482
It does seem inefficient that you have declared 14 ImageViews
on one page, but if you really need that for your purpose, this code will work fine for you:
for (int i = 1; i <= 14; i++) {
String imageViewId = "letter" + i;
int resId = getResources().getIdentifier(imageViewId, "id", getPackageName());
ImageView imageView = findViewById(resId);
// do what you need to do here
}
P.S. There's probably a better way to do what you need to do instead of declaring 14 ImageViews
.
Upvotes: 1
Reputation: 9437
If you can pass "R.id.letterX" as a String: easily:
List<ImageView> views = new ArrayList<ImageView>();
for ( int i = 0; i < length; i++){
views.add((ImageView)this.findViewById("R.id.letter" + (i+1));
}
so, just rewrite your findViewById method to take a String as parameter
Upvotes: 0
Reputation: 234715
Consider writing
ImageView letterViews = new ImageView[14];
for (int n = 0; n < 14; ++n){
letterViews[n] = (ImageView) this.findViewById(R.id.letters[n]);
}
where I have also anticipating a similar refactoring job on the object to which id
is a reference: I've collapsed the fields letter1
, letter2
, etc. into an array called letters
using a declaration similar to that for letterViews
.
Note that arrays in Java are zero-based: i.e. one of size 14 is indexed with 0 to 13.
Upvotes: 1