안녕하세요. 검색을 너무 못해서 그런지 이 문제를 해결 못하겠네요.


일단 하고싶은것은


액티비티를 처음 로드할때, 주 layout을 불러와서 띄운다음 안에있는 RelativeLayout 에 몇개의 TextView를 넣으려는 것입니다.

이 TextView는 서로 다른 위치에 다른크기로 보여질 것입니다. 그 크기와 위치는 데이터베이스에 존재하는 값입니다.


과정을 다시 쓰면, 아래와 같습니다.

1. RelativeLayout 객체 얻기

2. 데이터베이스에서 각 TextView의 위치값 불러오기

3. Relativelayout의 크기를 얻어서 데이터베이스에서 불러온 값과 계산하여 표시할  위치및 크기를 결정

3. TextView를 생성(크기 및 위치 설정)

4. RelativeLayout에 TextView 추가.


그런데 onCreate에다가 이것을 했더니 화면에 보이지 않습니다. 그래서 문제를 찾아보니

RelativeLayout의 크기가 항상 0으로 나옵니다.

RelativeLayout의 가로세로 크기를  match_parent로 지정했는데 이게 화면에 뷰들이 띄워지기 전에는 실제 크기를 알수 없다고 하는군요. 그래서 화면이 다시시작되는 이벤트인 onResume에 소스를 두고 다시 실행했더니 여전히 화면에 아무것도 나타나지 않습니다. 그런데 한번뷰를 보인다음 다른화면으로 갔다가 다시 돌아오면 모든 데이터가 보여집니다.

그러니까 처음만 뜨지 않는겨죠. 계산을 할수가 없어서.


그래서 더 찾아보니 어느분이

@Override

public void onWindowFocusChanged(boolean hasFocus) {

}

이것을 이용하면 된다고 하는 글이 있길래 했더니 처음 로드되는 동안 이 이벤트가 자동으로 발생되지 않고

그래서 onResume에서 수동으로 부르면 어떨까 싶었는데 setFocus라던지 포커스를 변경하는 함수가 없었습니다.


어떻게 하면 처음 로드시에 뷰의 크기를 얻을수 있을까요?


다시말하면, 화면에 뷰들이 다 그려진다음 발생하는 이벤트가 무엇일까요?




현재 마지막 소스는 다음과 같습니다.  (다른화면 갔다가 오면 보이지만 처음에는 띄워지지 않는 소스.


  <RelativeLayout android:id="@+id/layoutFrame" 
                            android:layout_width="match_parent" 
                            android:layout_height="match_parent"
                            android:layout_weight="1">
</RelativeLayout>


 RelativeLayout mFrame;
int mBaseWidth;
int mBaseHeight;
int mSize = 10;


onResume()
{
    .........

    RelativeLayout.LayoutParams  layout;
    ArrayList<item> data = null;

    mFrame = (RelativeLayout)this.findViewById(R.id.layoutFrame);
    mBaseWidth  = mFrame.getWidth()/mSize;
    mBaseHeight = mFrame.getHeight()/mSize;
    data = DB.getItem();

    for(item t:data)
    {
        layout= new RelativeLayout.LayoutParams(t.width*baseWidth, t.height*baseHeight);
        layout.setMargins(t.left*baseWidth, t.top*baseHeight, 0, 0);
        
        TextView tv = new TextView(this);
        tv = new TextView(this);
        tv.setLayoutParams(layout);
        tv.setText(t.value);

        mFrame.addView(tv);
    }
    ..........
}