<--! 안드로이드 레이아웃 인플레이션 ( LayoutInflater ) -->

안드로이드 레이아웃 인플레이션 ( LayoutInflater )

필그램

·

2017. 7. 27. 00:46

안드로이드 프로그램에서 화면을 구성할때는 XML 레이아웃으로 만들고, 이를 실행할때는 메모리로  로딩되어 객체화된다. 이를 인플레이션 이라 한다.


레이아웃 인플레이션은 전체화면을 객체화 하기도 하고, 일부분을 하기도 한다.

메인액티비티를 보면 setContentView(R.layout.activity_layoutinflator)

가 있는데 이부분이 객체화 하는 부분이다. 


일부분을 객체화 하는 부분을 테스트 하기위해 아래처럼 구성하려합니다.



맨 위의 버튼을 누르면, sub1.xml이라는 XML화면이 객체화되어, 버튼 아래쪽으로 오는 것이다. 처음에는 아래은 하늘색 화면은 없이 버튼만 보이게 됩니다. 이부분은 FrameLayout  으로 비워놓고 버튼 클릭시 sub1.xml화면을 불러 오는 것입니다.


버튼 클릭 함수 부분은 아래와 같으며, 숙달되지 않으신 분들은 여러번 사용해 보면 좋습니다.

 button.setOnClickListener(new View.OnClickListener() {~~~

여기 까지 치시면, 뒷 부분은 자동으로 생성 됩니다. 

아래가 자동생성 되는 부분으로, 이 안에 버튼이 눌렸을 때의 코드를 넣습니다.

@Override
public void onClick(View v) { }


[ xml 소스 : activity_layoutinflator.xml]

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="korea2canada.com.doitch2mybasicwiget.Layoutinflator">

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.054"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintVertical_bias="0.017"
android:layout_marginLeft="8dp"/>

<FrameLayout
android:id="@+id/container"
android:layout_width="371dp"
android:layout_height="421dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3">

</FrameLayout>
</android.support.constraint.ConstraintLayout>

[ 두번째  xml 소스로 첫번째 화면 안에 들어갈 화면 : sub1.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_dark"
android:orientation="vertical">

<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="부분화면"
android:textSize="40sp"/>

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
</LinearLayout>



[java 소스]

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

public class Layoutinflator extends AppCompatActivity {

FrameLayout container;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layoutinflator);

Button button3 = (Button) findViewById(R.id.button3);
container = (FrameLayout) findViewById(R.id.container);

//버튼 클릭시 온클릭 리스너 실행
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//레이아웃을 객체화 하는 인플레이션으로 컨테이너에 담을수(붙일수) 있다.
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.sub1, container, true);
//R.layout.sub1 : xml 레이아웃 지정한것 / container라는 확보된 공간에 붙이는 것을 말한다
//true는 바로 붙이라는 의미

}
});

}
}


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

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


설명은 주석으로 소스내에 포함하였습니다.


반응형