2012-04-14 23 views
0

私はRelativeLayoutに8つのImageViewを持っています。 活動はのonCreateそれがinitメソッドを起動すると:開始時にランダムな位置を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。ところで が、私はonWindowFocusChangedにinit()メソッドをコールしようとした、(それは正しい方法ではIllegalArgumentException、上部と左の数の問題を解決するが、ImageViewのも、letter.layout後に左上隅にとどまる)

答えて

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

あなたはすべてのImageViews

+0

のためにあなたのヒントをありがとうidを必要としませんが、私はかなりよこの道確かに、それは問題ではなく、IDは正しい順序で一つずつです。しかし、私の正確な質問は、gameFieldViewのgetHeightまたはgetWidthの返り値で約0でした。 –

関連する問題