2012-04-14 2 views
0

У меня есть 8 ImageViews на моем RelativeLayout. Когда активность OnCreate начинается метод инициализации:Установите случайное положение для ImageView при запуске

private void init() { 
     gameFieldView = (RelativeLayout) getGameFieldView(); 
     mainView = (LinearLayout) getMainView(); 
     topOffset = mainView.getHeight() - gameFieldView.getHeight() - 6; 
     // THERE ARE 0 height and width of gameFieldView, and mainView 
     for (int i = 0; i < LETTERS_NUMBER; i++) { 
      ImageView letter = (ImageView) findViewById(R.id.e1_letter + i); 
      generateRandomPosition(random, letter); // When i comment this line it is ok (What kind of sorcery is this?), but i want to set random position to ImageView "letter" 
     } 
    } 

Теперь generateRandomPosition выглядит

private void generateRandomPosition(Random random, ImageView letter) { 
     int height = letter.getHeight(); 
     int width = letter.getWidth(); 
     int top = random.nextInt(gameFieldView.getMeasuredHeight() - height - topOffset); // It obviously crashes because of IllegalArgumentException - parameter < 0 because of gameFieldView height = 0 
     int left = random.nextInt(gameFieldView.getMeasuredWidth() - width); 
     letter.layout(left, top, left + width, top + height); 
    } 

Что я делаю не так? Заранее спасибо.

upd. Кстати, я пытался вызвать Init() в onWindowFocusChanged, он решает проблему с IllegalArgumentException, верхними и левыми подсчетами в правильном направлении, но ImageView остается в левом верхнем углу, даже после того, как letter.layout()

ответ

1

Было бы полезно, если бы вы отправили свой LogCat/StackTrace в следующий раз. В любом случае проблема заключается в следующей строке: findViewById(R.id.e1_letter + i); Вы получаете идентификатор ссылки на ресурс и добавляете к нему целое число. Это, вероятно, не указывает ни на что. Установка чего-то на нулевом объекте не будет работать. Было бы намного проще для вас, чтобы Переберите детей RelativeLayout следующим образом:

ViewGroup v = (ViewGroup) gameFieldView; 
for(int i = 0; i < v.getChildCount(); ++i) { 
    ImageView letter = (ImageView) v.getChildAt(i); 
    generateRandomPosition(random, letter); 
} 

Таким образом, вам не нужно будет идентификаторами для всех ImageViews

+0

Спасибо за ваш намек, но я довольно конечно, что это не проблема, а id в правильном порядке один за другим. Но мой точный вопрос был около 0 в ответ на getHeight или getWidth of gameFieldView. –

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