앞전에는 리니어 레이아웃과 그 안에 들어 있는 세 개 버튼은 XML로 정의한 후 이 XML 리소스 파일의 위치를 액티비티에서 사용된 setContentView() 메소드의 파라미터로 전달하여 화면에 보여주었습니다. 이렇게 화면에 보이는 레이아웃을 XML로 정의하게 되면 나중에 화면 구성을 바꿀 때도 간단하게 XML만 수정하면 되므로 훨씬 이해하기 쉽고 모듈화된 구성이라고 할 수 있습니다. 그러나 종종 코드 상에서 화면을 구성해야 하는 경우가 생기게 됩니다. 예를 들어 사용자가 입력한 데이터, 파일에서 읽어 들인 데이터 또는 네트워킹을 통해 서버에서 받아온 데이터의 유형에 따라 화면의 구성을 바꾸고 싶다면 XML로 정의하는 것보다 자바 코드에서 화면을 구성하는 것이 훨씬더 효율적인 방법입니다. 예제를 보도록 하겠습니다.



MainActivity.java 

package com.example.example;


import android.app.Activity;

import android.os.Bundle;

import android.widget.Button;

import android.widget.LinearLayout;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

                // new 연산자로 리니어 레이아웃 만들고 방향 설정

LinearLayout mainLayout = new LinearLayout(this);   

mainLayout.setOrientation(LinearLayout.VERTICAL);

                 // new 연산자로 레이아웃 안에 추가될 뷰들의 파라미터 생성

LinearLayout.LayoutParams params = 

new LinearLayout.LayoutParams( 

LinearLayout.LayoutParams.MATCH_PARENT, 

LinearLayout.LayoutParams.WRAP_CONTENT);

                // 버튼에 파라미터 설정하고 레이아웃에 추가

Button button01 = new Button(this);

button01.setText("버튼1");

button01.setLayoutParams(params);

mainLayout.addView(button01);

                // 새로 만든 레이아웃을 화면에 설정

setContentView(mainLayout);

}


}



위 코드를 실행을 시키면 다음과 같은 결과가 나오게 됩니다.




프로젝트를 처음 만들었을 때 볼 수 있었던 자바 코드에는 onCreate() 메소드 안에 setContentView() 메소드가 사용되었는데, 그것과 앞에서 살펴본 코드의 다른 점은 setContentView() 메소드 안에 들어가는 파라미터가 R.layout.main과 같이 XML 레이아웃으로 정의된 리소스가 아니라 자바 코드에서 만든 뷰그룹 객체라는 것입니다. 리니어 레이아웃으로 만든 객체를 setContentView() 메소드의 파라미터로 전달하면 리니어 레이아웃 안에 추가된 뷰들을 배치한 화면을 볼 수 있습니다. 안드로이드는 XML 레이아웃에서 정의할 수 있는 대부분의 속성들을 자바 코드에서 객체를 만들거나 객체의 메소드를 호출하여 설정할 수 있도록 지원하는데 리니어 레이아웃의 방향 속성도 마찬가지입니다. new LinearLayout()을 통해 만들어진 리니어 레이아웃 객체에는 setOrientation() 메소드를 사용할 수 있으며, setOrientation(LinearLayout, VERTICAL)과 같이 방향 속성을 정의한 상수를 파라미터로 전달하면 세로 방향 또는 가로 방향으로 뷰를 추가할 수 있습니다. 뷰 객체를 코드에서 만들 때 뷰의 생성자에는 항상 Context 객체가 전달되어야 하는데 액티비티는 컨텍스트(Context)를 상속하므로 액티비티 클래스 안에서는 this를 Context 객체로 사용할 수 있습니다.

자바 코드 상에서 뷰를 만들어 뷰그룹에 추가할 때는 뷰의 배치를 위한 속성을 설정할 수 있는 LayoutParams 객체를 사용합니다. LayoutParams 객체를 새로 만들 경우에는 반드시 뷰가 추가될 영역에 대한 기본 채우기(fill) 속성을 지정해야 하며, 이 때 사용하는 두 가지 상수인 LayoutParams.MATCH_PARENT 와 LayoutParams.WRAP_CONTENT 중 하나가 사용됩니다. 필요한 경우에는 이 두 가지 상수가 아닌 가로와 세로의 크기값을 직접 설정할 수도 있습니다.

뷰그룹에 뷰를 추가하기 위해서는 addView() 메소드를 사용합니다. addView() 메소드에는 추가할 뷰를 파라미터로 전달할 수 있으며, 필요한 경우 부모 컨테이너에서 사용할 레이아웃 파라미터인 LayoutParams 객체를 같이 전달할 수도 있습니다. 앞서 살펴보았던 코드에서는 addView() 메소드를 호출할 때 LayoutParams 객체를 전달하지 않고 버튼 객체의 setLayoutParams() 메소드를 이용해 레이아웃 파라미터를 먼저 설정한 후 addView() 메소드에는 버튼 객체만을 전달하는 방법을 사용했습니다.


다음 포스팅에서는 정렬 방향 설정하는 속성인 gravity에 대해서 알아보도록 하겠습니다.



Posted by 정윤문경아빠