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을 알게되었는데, 처음엔 별 생각없이 그저 나눠서 디자인 하니까 편하다고만 생각했는데 자세히 알아가면 갈 수록 단순한 개념이 아니라는걸 느낀다.
'Programming > ANDROID' 카테고리의 다른 글
INSTALL_FAILED_INSUFFICIENT_STORAGE (2) | 2011.04.11 |
---|---|
eclipse (Helios)에서 android 개발 코딩 속도 버그 수정 (2) | 2011.04.06 |
Layout 중첩 - Multi Page (6) | 2011.03.29 |
ViewGroup - RelativeLayout (2) | 2011.03.29 |
ViewGroup - TableLayout (1) | 2011.03.29 |