다른 사람들은 모르겠지만, 나의 경우는 xml에 미리 만들어 놓고 사용하는 것보다, 그때 화면에 띄우는 것을 선호하는 편이다. 그래서 Class 생성 시 onCreateView에서 이것저것 처리하는데, 그 기본이 되는 TextView의 동적 생성을 알아 볼까 한다.
FrameLayout frame = (FrameLayout) view.findViewById(R.id.frameView);
RelativeLayout.LayoutParams layouts = (RelativeLayout.LayoutParams) frame.getLayoutParams();
TextView textview = new TextView(view.getContext());
textview.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
layouts.addRule(RelativeLayout.BELOW, R.id.frameMaster);
textview.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
textview.setText(R.string.list_empty);
frame.addView(textview, layouts);
위 코드가 동적생성을 한 모습이다.
보면 frame은 이미 xml에서 정의한 녀석을 사용하였고, 그 때 정의된 layout parameter를 받아오기 위하여 getLayoutParams() 메소드를 통하여 정보를 받아 왔다.사실 여기서 나의 삽질이 발생했는데, 바로 나는 layouts가 받아야 하는 줄 알고 RelativeLayout relative = (RelativeLayout)view.findViewById(R.id.frameRelative); 하고 나서 RelativeLayout.LayoutParams 에서 relative.getLayoutParams();를 출창 하였다. 이렇게 하니깐 당연히 app은 뻗어 버리고 강제 종료 당했다.
그래서 무엇이 잘못 되었나 찬찬히 살펴보니 RelativeLayout.LayoutParams 자체가 parent의 정보를 받아와 적용하는 부분이라는 설명을 읽고선 relative가 필요 없음을 알게 되었다. 이걸 지우고 layouts에 framedml LayoutParams의 정보를 넣어 주니 바로 해결이 되었다.
아무튼 그리고 이후에 나오는 rule은 relative와 관련해서 어떠한 조건을 붙일 것이냐인데, 나는 frameMaster 아래에 놓을 것이므로 해당 룰을 BELOW로 변경 하였다.
그리고 마지막은 frame에 내가 생성한 객체들을 연결해 주는 것으로 종료가 된다.
덧. xml은 다음과 같이 정리하였다.
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="com.autonics.daqmaster.UnitListFragment">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<FrameLayout
android:id="@+id/frameMaster"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_master_layout_height"
android:layout_gravity="top">
... 생략 ...
</FrameLayout>
<FrameLayout
android:id="@+id/frameView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/frameMaster">
<ListView
android:id="@+id/listViewUnitList"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</FrameLayout>
</RelativeLayout>
</FrameLayout>