2012-01-07 3 views
0

Моя проблема в этом. У меня есть несколько объектов ImageView в моем XML-макете. Я хочу иметь возможность помещать изображения в них, опираясь на некоторые «if» и «else» (так сказать). Поэтому я подумал, что я бы присвоил все эти объекты массиву. Но приложение не начнется. Вот как я это сделал:Установить массив ImageView (Android)

private void setImageView(){ 
    images = new ImageView[imagesNR]; 
    images[0] = (ImageView) findViewById(R.id.imageView1); 
    images[1] = (ImageView) findViewById(R.id.imageView2); 
    images[2] = (ImageView) findViewById(R.id.ImageView01); 
    images[3] = (ImageView) findViewById(R.id.ImageView02); 
    images[4] = (ImageView) findViewById(R.id.ImageView03); 
    images[5] = (ImageView) findViewById(R.id.ImageView04); 
    images[6] = (ImageView) findViewById(R.id.ImageView05); 
    images[7] = (ImageView) findViewById(R.id.ImageView06); 
    images[8] = (ImageView) findViewById(R.id.ImageView07); 
    images[9] = (ImageView) findViewById(R.id.ImageView08); 
    images[10] = (ImageView) findViewById(R.id.ImageView09); 
    images[11] = (ImageView) findViewById(R.id.ImageView10); 
} 

Я понимаю, что это это не preatiest путь, но так как я новичок, это то, что я придумал. Я боюсь, я не могу рассказать вам слишком много об ошибке. Приложение закрывается, и все.

Есть ли другой способ я могу иметь массив ImageView и манипулировать ими соответствующим образом? ... Я хочу, чтобы поместить объекты в RelativeLayout и установить, куда поместить все эти ImageViews и т.д., и т.д.

Редактировать:

private ImageView images[]; 

Вот как я объявил массив.

+0

Вставьте трассировку стека из вашего объекта для закрытия. – Joru

ответ

0

Ваш imageView определяется как ниже (отметьте скобки). Это определение из одного из моих приложений и работает определенно.

ImageView mCnName[]= new ImageView[NUMBER_OF_IMAGE]; 

Путь в принципе не так, но если все ImageView должны иметь одинаковые или же атрибуты, то я хотел бы использовать немного неуверенный в себе подход. Позволяет вам по умолчанию просматривать все изображения с синим фоном. Как и вы, вам придется либо в вашем файле layout.xml указать каждый из этих атрибутов, либо вам нужно будет запустить цикл, чтобы изменить цвет bg каждого ImageView программно.

Практически во всех моих приложениях я предпочитаю такой подход. Определите ImageView со всеми атрибутами в вашем XML-файле.

  1. определяют layoutinflater и использовать mLayOutInflater=this.getLayoutInflater();
  2. mCnName[i]=mLayOutInflater.inflate(R.layout.yourImageView, null);
  3. добавить надутый вид с parentLayout.addView(mCnName[i],null); Как это проще спроектировать и изменить макет позже.

Но, как я уже сказал, совершенно не обязательно использовать мой подход. Твой может работать.

+0

Вам придется попробовать свой путь. Я думаю, мне понадобится некоторое время, прежде чем я получу его ... –

+0

OMG, я глуп .... Я не устанавливал переменные imagesNR ... Он был неуправляемым. Просто нужно было установить imagesNR = 12, и все хорошо ..... OMG –

1

Я знаю, что вы говорите, что все хорошо, а просто предложение. Это принесет пользу вам намного позже, если вы потратите время, чтобы устроиться с этой моделью сейчас. Вы должны знать, что несколько изображений более дорогие, чем композитные. Если вы хотите отобразить массив изображений, я предлагаю вам использовать реализацию, которая была разработана именно для этого; Галерея, GridView или ListView приходят на ум.

+0

Я не говорю, что «мой» путь лучший, я определенно буду смотреть на «ваш» путь. Я оставлю это сейчас, так как он работает, и у меня нет времени на данный момент. План после того, как я закончил с «хромой» версией, попытается улучшить его ... Сделайте больше ... «динамическим» и «профессиональным», так сказать. Спасибо за подсказку. –

0

1.

for (int i = 0; i < container.getChildCount(); i++) { 
     images[i] = (ImageView) container.getChildAt(i); 
    } 

2.

for (int i = 0; i < 10; i++) { 
     int id = getResources().getIdentifier("R.id.imageView" + i, "id", null); 
     images[i] = (ImageView) getActivity().findViewById(id); 
} 

Второй один довольно дорого, так как в соответствии с РОУ getIdentifier:

Примечание: использование этой функции не рекомендуется. Гораздо эффективнее извлекать ресурсы по идентификатору, чем по имени.

Смежные вопросы