Ciatzo
Ciatzo

Reputation: 43

Is it possible to declare muliple variables with a for loop?

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

Answers (4)

Patrick
Patrick

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

Lai Xin Chu
Lai Xin Chu

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

Stultuske
Stultuske

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

Bathsheba
Bathsheba

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

Related Questions