JAVA 코드에서 Activity를 상속받은 클래스는 화면을 구성하기위해서 기본적으로 main.xml이라는 기본으로 생성되는 레이아웃을 생성하여 보여주기위해 setContentView()를 사용한다. (activity 클래스에서 onCreate()는 자바SE의 main() 처럼 프로그램 실행시 가장 먼저 실행되는 메서드이다.)
그럼 여기서 자바 코드로 xml문서에 접근이 가능하기 때문에 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을 알게되었는데, 처음엔 별 생각없이 그저 나눠서 디자인 하니까 편하다고만 생각했는데 자세히 알아가면 갈 수록 단순한 개념이 아니라는걸 느낀다.
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 |