2012-04-14 144 views
0

我在我的RelativeLayout上有8个ImageViews。 当活动的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);您正在获取资源的引用ID并向其中添加整数。这可能不指向任何东西。在空对象上设置某些东西是行不通的。 这将是你通过的RelativeLayout的孩子回路容易得多,具体如下:

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

这样你就不需要IDS所有ImageViews

+0

感谢您的提示,但我敢当然,这不是一个问题,ID的顺序是一个接一个。但是,我确切的问题是getHeight或gameFieldView的getWidth返回值大约为0。 – 2012-04-14 19:58:28