0

我的 RelativeLayout 上有 8 个 ImageView。当活动 onCreate 它启动方法 init:

 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);
    }

我究竟做错了什么?提前致谢。

更新。 顺便说一句,我尝试在 onWindowFocusChanged 中调用 init(),它解决了 IllegalArgumentException 的问题,顶部和左侧计数以正确的方式,但即使在 letter.layout() 之后,imageview 仍保持在左上角

4

1 回答 1

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); 
}

这样你就不需要所有 ImageViews 的 id

于 2012-04-14T19:38:45.837 回答