안드로이드 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에 대한 설명이 있습니다.
댓글 영역