티스토리 뷰

Android/정리

레이아웃 인플레이션

란텔 2016. 5. 9. 19:49

XML레이아웃 파일은  안드로이드 애플리케이션이 실행될 때 메모리로 로딩되어 객체화 된다.

XML레이아웃에 정의된 내용이 메모리 상에 객체화 되는 과정을 인플레이션 이라고 한다.



XML레이아웃 파일은 프로젝트가 빌드 되면 컴파일되어 이진 파일로써 안드로이드 애플리케이션에 포함되긴 하지만 실행 시점이 되어서야 메모리에 로드되어 객체화되기 때문에 자바에서 setContentView()가 호출되기 전에 해당 XML의 뷰를 참조하려 한다면 에러가 발생할 것이다. 이유는 메모리에 객체화 되지 않은 정보를 참조하려고 했기 때문이다..




setContentView(int layoutResID)가 XML파일에 대해 화면 전체를 나타내는 역할을 하는데, 일부의 뷰에서 다른 XML파일의 레이아웃을 가져올 수도 있다.



안드로이드에서는 이를 위해서 LayoutInflater라는 클래스를 제공하고 있다.



LayoutInflater 참조변수 사용 방법

LayoutInflater li = (LayoutInflater) getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE); li.inflate(int layoutId, ViewGroup vg, true);

getSystemService메서드를 사용하면 LayoutInflater객체의 변수가 참조할 수 있다.

inflate메서드를 사용하면 다른 XML레이아웃 객체를 현재 동작 중인 XML레이아웃 뷰에 포함시킬 수 있다.



LayoutInflater l = LayoutInflater.from(this);
        l.inflate(int layoutId, ViewGroup vg);

또 다른 방식으로 static메서드인 from메서드를 사용하면 LayoutInflater객체를 사용할 수 있다.




다음은 하나의 액티비티에서 다른 XML레이아웃 객체를 포함시킨 코드이다.

- activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.choonie.page213application.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="activityResult"
        android:text="화면"
        android:textSize="25dp"/>

    <LinearLayout
        android:id="@+id/linear"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/button">



    </LinearLayout>



</RelativeLayout>

- sub_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:text="텍스트뷰"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="버튼"/>


</LinearLayout> 

- MainActivity.java

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        LinearLayout layout = (LinearLayout) findViewById(R.id.linear);
        


        //LayoutInflater li = (LayoutInflater) getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
        //li.inflate(R.layout.sub_layout, layout, true);

        LayoutInflater l = LayoutInflater.from(this);
        l.inflate(R.layout.sub_layout, layout);

    }


}
}

- 결과화면










'Android > 정리' 카테고리의 다른 글

인텐트  (0) 2016.05.10
화면 이동과 데이터 전달  (0) 2016.05.09
FrameLayout 프레임레이아웃  (0) 2016.05.03
TableLayout 테이블레이아웃  (0) 2016.05.03
layout_gravity와 gravity속성 (뷰의 정렬)  (0) 2016.04.29
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday