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、top と left のカウントの問題は解決しましたが、letter.layout() の後でも imageview は左上隅のままです。

4

1 に答える 1

1

次回は LogCat/StackTrace を投稿していただけると助かります。とにかく、問題は次の行にありfindViewById(R.id.e1_letter + i);ます。リソースへの参照 ID を取得し、それに整数を追加しています。それはおそらく何も指していません。null オブジェクトに何かを設定しても機能しません。次のように、RelativeLayout の子をループする方がはるかに簡単です。

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

この方法では、すべての ImageView の ID は必要ありません

于 2012-04-14T19:38:45.837 に答える