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을 알게되었는데, 처음엔 별 생각없이 그저 나눠서 디자인 하니까 편하다고만 생각했는데 자세히 알아가면 갈 수록 단순한 개념이 아니라는걸 느낀다.


 

'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

1. 안드로이드에서는 기존의 자바처럼 코드상에서 화면을 구성하며 데이터를 정의하고 사용할 수 있지만 XML 문서를 이용하는 방법을 새롭게 지원하고있다.


2. XML 레이아웃의 장점

 - 코드와 데이터가 완벽하게 분리되므로 개발자와 디자이너의 분담 작업이 용이하다.

 - 조건에 따라 레이아웃을 통째로 교체할 수 있으므로 호환성 확보국제화에 유리하다.

 - 레이아웃만 수정할 때는 컴파일하지 않아도 되므로 개발 속도가 빨라진다.

 - 구조와 속성을 함축적으로 기술할 수 있으며 레이아웃 재활용도 가능하다.


3. 실무에서는 코드 레이아웃과 XML 레이아웃을 둘 다 사용하며 동시에 적용하기도한다. 디자인에 관련된 정적인 레이아웃은 주로 XML코드로, 런타임과 연관있는 레이아웃은 자바 코드를 사용하는것이 보통이다.

4. 가장 기본적으로 생성되는 메인.xml을 살펴보자.
main.xml  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>
가장 위에 xmlns에서 안드로이드 애트리뷰트를 사용하겠다는 네임스페이스를 선언하는것이고 이 애트리뷰트 형식은 android:속성명="속성값" 이다. 각 속성명들과 속성값은 매우 다양하고 많기 때문에 예제를 통해서 하나씩 알아가는 것이 좋겠다.

5. 문자의 경우 Strings.xml에 마찬가지로 xml 형태로 관리되어 사용 할 수 있으며 아래와 같이 직접 문자열을 쓸 수 도 있다.
<TextView
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="문자를 직접 입력합니다" />
6. AndroidMenifest.xml
 - 안드로이드 프로젝트 생성시 자동으로 생성되는 파일로 현재 프로젝트에 대한 뼈대를 구성하고있는 파일이다. 패키지 이름, 버전, 설치경로, SDK버전, Activity 등록 등에 대한 정보를 가지고있다.  

+ Recent posts