안드로이드 UI 레이아웃 코드(동적)으로 설정하기

프로그래밍/Android 관련2018. 3. 23. 00:14

안녕하세요. 개발자 드리머즈입니다.


안드로이드에서 UI(ex:뷰의 레이아웃 설정)등은 일반적으로 xml파일에서 하게 됩니다. 하지만 프로그램 실행중에 동적으로 UI가 변경되어야 한다면 xml파일이 아닌 java코드에서 설정해야 합니다. 여기서 그 방법에 대해 보려고 합니다.


수정 전 실행화면

RelativeLayout내에 TextView 2개를 포함하는 아주 간단한 예제입니다.

TextView2가 TextView1의 아래에 위치하고 있습니다.


수정 전 코드

main_activity.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:layout_centerVertical="true"
        android:textSize="30sp"
        android:background="#ff0000"
        />
 
    <TextView
        android:id="@+id/tv2"
        android:layout_below="@id/tv"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="TextView2"
        android:textSize="30sp"
        android:background="#00ff00"
        />
 
</RelativeLayout>
cs


MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends AppCompatActivity {
 
    TextView tv;
    TextView tv2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tv = findViewById(R.id.tv);
        tv2 = findViewById(R.id.tv2);
    }
}
cs




수정 후 코드

TextView1의 밑에 위치하고 있던 TextView2를 TextView1의 위에 배치하려고 합니다. MainActivity.java만 수정하면 됩니다.


*수정된 MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends AppCompatActivity {
 
    TextView tv;
    TextView tv2;
 
    RelativeLayout.LayoutParams layoutParams;
    float dp;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tv = findViewById(R.id.tv);
        tv2 = findViewById(R.id.tv2);
 
 
        dp =  getResources().getDisplayMetrics().density;
        layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, (int)(50*dp));
        layoutParams.addRule(RelativeLayout.ABOVE,R.id.tv);
        tv2.setLayoutParams(layoutParams);
 
    }
}
cs

위의 코드에서 연두색 음영으로 표시한 코드가 추가된 코드입니다. 

(float형 변수 dp는 pixel단위가 아닌 dp단위로 표현하기 위해 사용됨)


위의 초록색 코드는 xml로 보면 아래의 코드와 동등한 효과를 가집니다.

1
2
3
android:layout_above="@id/tv"
android:layout_width="wrap_content"
android:layout_height="50dp"
cs




수정 후 실행 화면


참고

https://developer.android.com/reference/android/util/DisplayMetrics.html#density

위의 안드로이드 공식 사이트에 pixel을 dp단위로 변경하기 위해 쓰인 getDisplayMetrics().density에 대한 설명이 있습니다.





작성자

Posted by 드리머즈

관련 글

댓글 영역