JAVA 코드에서 Activity를 상속받은 클래스는 화면을 구성하기위해서 기본적으로 main.xml이라는 기본으로 생성되는 레이아웃을 생성하여 보여주기위해 setContentView()를 사용한다. (activity 클래스에서 onCreate()는 자바SE의 main() 처럼 프로그램 실행시 가장 먼저 실행되는 메서드이다.)
package com.example.TestAndroid;
import android.app.Activity;
import android.os.Bundle;
public class TestAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
xml문서의 레이아웃은 뷰를 담는 컨테이너 역할을 하는 부분으로 그 내부에 실제 화면에 나타날 View 객체들의 목록과 구조, 속성들이 정의되어있다. 이러한 xml문서를 실제 안드로이드 프로그램이 실행될 때 메모리에 올리는 과정은 ADT에 포함된 aapt(Android Asset Packaging Tool)에 의해 수행된다. 바로 이러한 수행을 하도록 코드상에 존재하는 메소드가
setContentView() 인 것이다. 이러한 동작을
Inflation(전개)이라고 한다.
그럼 여기서 자바 코드로 xml문서에 접근이 가능하기 때문에 xml문서 없이 레이아웃을 만들 수 있을 것이다.
package com.example.InflationTest;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
public class InflationTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
linear.setBackgroundColor(Color.WHITE);
TextView text = new TextView(this);
text.setText("코드로 생성");
text.setGravity(Gravity.CENTER);
text.setTextColor(Color.RED);
text.setTextSize(20);
linear.addView(text); //부모 자식관계 설정과정
setContentView(linear);
}
}
코드상에서 생성한 LinearLayout을 setContentVIew()에 넘겨주었다. 출력결과는 역시 xml로 만든 레이아웃과 다를게 없다.
조금 더 파고 들어 가 보면, 안드로이드는 xml문서의 전개를 위해 시스템 수준에서 전개자를 따로 제공하는데 Activity의 getSystemService()로 전개자를 구할 수 있다. 그리고 전개자 객체의
inflate()로 전개를 수행한다.
- Vew inflate(int resource, ViewGroup root)
inflate()는 또 View의 정적 매소드로도 존재하는데 다음의 사용법과도 동일하다.
- static View inflate(Context context, int resource, ViewGroup root)
그럼 여기서 또 헷갈려진다. xml을 전개하여 액티비티에 전개하는 과정은 맨 처음 setContentVIew(linear)로 실행하였는데 위의 inflate()메소드는 또 뭐란말인가..
사실 onCreate() 내부에서 아래 두 코드 모두
동일한 결과를 가져온다.
- setContentView(R.layout.main)
- LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = (View) inflater.inflate(R.layout.main, null);
setContentView(v);
즉, 결과는 같지만 inflate()를 사용하는 것은 xml문서를 JAVA코드 단계에서 시스템적으로 언제든지 전개 할 수 있다는 것을의미한다.
자바에 익숙해 져 있다 안드로이드 덕분에 XML을 알게되었는데, 처음엔 별 생각없이 그저 나눠서 디자인 하니까 편하다고만 생각했는데 자세히 알아가면 갈 수록 단순한 개념이 아니라는걸 느낀다.