RelativeLayout 동적으로 View 배치

Posted by ITPangPang
2017. 6. 13. 00:47 안드로이드(android)/레이아웃(Layout)




RelativeLayout 안에서

코드를 통한 View 배치







ㆍ LinearLayout과 크게 다른점은 없으나, View를 정렬하는

    부분에서 알아보고 가야할 부분이 있으므로 짧게 적어봅니다.




간단하게 알아볼 것



이 3가지만 보고 가겠습니다.


android:layout_centerInParent

android:layout_centerHorizontal

android:layout_below




그리고

이번글에서 만들어볼 화면

TextView, Button

각각 1개씩 배치되어 있는

화면입니다.


이 화면을 xml에서 만들면

아래와 같은 식으로 간단하게

만들 수 있습니다.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="xyz.itpangpang.study.MainActivity">


<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1단계"
android:textColor="#104616"
android:textSize="30dp"
android:layout_centerInParent="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:layout_below="@+id/tv"
android:layout_centerHorizontal=
"true"
/>

</RelativeLayout>



이번에는 java 코드를 통해서


먼저 최상단

RelativeLayout은 생성해놓고

시작하겠습니다.


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);
}



이제 하나하나 추가해보겠습니다.


먼저 TextView를 생성한 후에

text, color, size를 적어주겠습니다.

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);
TextView tv = new TextView(this);
tv.setText("1단계");
tv.setTextColor(Color.parseColor("#104616"));
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
}


이제 id를 부여하고

TextView를 화면의 중앙에

가져다 놓기 위해서

centerInParent를 True로 놔야겠죠



id를 부여하기 위해서

[values]-[ids.xml]을 하나

만든 후에 아래와 같이 적어줍니다

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="stage_text_view" />
</resources>


위에서 만든

id를 setId하고

TextView를 중앙에 놓기 위해

LayoutParams을 하나 만들어 준 후에

속성값을 넣어줍니다.


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);
TextView tv = new TextView(this);
tv.setText("1단계");
tv.setTextColor(Color.parseColor("#104616"));
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
tv.setId(R.id.stage_text_view);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams
(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
tv.setLayoutParams(layoutParams);
rl.addView(tv);
}


RelativeLayout의 LayoutParams에서는

 addRule이란 메서드가 있습니다.


이 addRule을 통해서 View의 배치를

할 수 있습니다.


여기까지 하고 실행을 한번 해보면

아래와 같은 화면을 볼 수 있습니다


이제 똑같은 방법으로

TextView 아래에 START라는

버튼을 놓아보겠습니다.


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);

TextView tv = new TextView(this);
tv.setText("1단계");
tv.setTextColor(Color.parseColor("#104616"));
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
tv.setId(R.id.stage_text_view);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams
(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
tv.setLayoutParams(layoutParams);
rl.addView(tv);

RelativeLayout.LayoutParams buttonLayoutParams = new RelativeLayout.LayoutParams
(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
Button button = new Button(this);
button.setText("START");
buttonLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
buttonLayoutParams.addRule(RelativeLayout.BELOW, tv.getId());

button.setLayoutParams(buttonLayoutParams);
rl.addView(button);
}


위와 똑같은 방법으로

addRule을 적은 후에


이번에는

CENTER_HORIZONTAL을 적용한 후에

추가로 TextView 아래에 위치 해야 하므로

BELOW도 적어주었습니다.


위와 같이 작성 후

돌려보면 처음 xml에서 작성한

화면과 똑같은 화면을 얻을 수 있습니다.



이번글에서는

addRule과 setId를 작성하는 부분만

잘 알아두시면 될 것 같습니다.


setId 하는 방법은 위 방법 말고도

다른 방법이 있습니다만, 다른 방법은

TextView를 반복적으로 생성하거나 할때

한번 다뤄보도록 하겠습니다.