안드로이드에서 어떤 뷰를 Activity(화면)에 띄우려면 반드시 객체화가 되어야 한다.
인플레이션이란 XML 레이아웃에 정의된 내용(뷰)이 메모리에 객체화되는 과정이다.
이 과정을 간단하게 말하면
- UI를 디자인할 XML 파일 작성을 완료하면,
- 이후 setContentView 메소드에서 XML 레이아웃 파일을 매핑한다.
- 그러면 xml 파일을 View로 만들어서 Activity(화면) 위에 보여준다.
그러면 setContentView는 무슨 역할을 할까?
- Activity 화면에 나타날 뷰를 지정한다.
- 화면 전체를 설정하는 역할이지 부분 화면 설정은 불가능하다.
- XML 레이아웃 내용을 메모리에 객체화시킨다. 이것이 인플레이션(inflation)이다.
그렇다면 부분 화면 인플레이션은 어떻게 진행할까?
setContentView 메소드로는 부분 화면 설정이 불가능하다고 방금 언급했다.
부분 화면 인플레이션은 LayoutInflater 클래스를 이용하여 동적으로 부분 화면(뷰)를 부모 뷰에 추가한다.
LayoutInflater는 XML에 정의된 Resource를 View 객체로 반환한다.(인플레이션)
그럼 LayoutInflater 생성 방법을 알아보자. 크게 3가지가 있다.
1. Context에서 LayoutInflater를 가져오는 방법
val inflater : LayoutInflater =
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
2. Activity에서 LayoutInflater를 가져오는 방법
val inflater : LayoutInflater = getLayoutInflater()
3. LayoutInflater class를 static으로 선언되어 있는 LayoutInflater.from()을 통해 생성하는 방법이 있다.
val inflater : LayoutInflater = LayoutInflater.from(context)
아래는 부분화면 실습을 할 진행할 코드다.
activity_main.xml코드다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MainActivity">
<Button
android:id="@+id/btn_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:text= "부분화면 추가"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<FrameLayout
android:id="@+id/add_container"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:background="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_show"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
아래는 activity_sub.xml 코드다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MainActivity">
<TextView
android:id="@+id/tv_subview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="136dp"
android:background="#FFFFFF"
android:text="부분화면"
android:textSize = "30dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
아래는 레이아웃을 제어할 MainActivity 코드다.
findViewById를 사용했다.
package com.example.inflate
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Layout
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
import com.example.inflate.R
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn_show: Button = findViewById(R.id.btn_show)
val container : FrameLayout = findViewById(R.id.add_container)
val inflater = applicationContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val partView = inflater.inflate(R.layout.activity_part, container , false)
//val partView = LayoutInflater.from(this).inflate(R.layout.activity_part,null)
btn_show.setOnClickListener{
val parent = partView.parent as ViewGroup ?
parent?.removeAllViews()
container.addView(partView)
}
}
}
다음은 ViewBinding를 사용할 코드다. 당연히 build.gradle 파일에 buildFeatures { viewBinding true }를 추가해야 한다.
buildFeatures {
viewBinding true
}
아래는 ViewBinding를 이용한 MainActivity 버전이다.
package com.example.inflate
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Layout
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
import com.example.inflate.R
import com.example.inflate.databinding.ActivityMainBinding
import com.example.inflate.databinding.ActivityPartBinding
class MainActivity : AppCompatActivity() {
private val binding by lazy{
ActivityMainBinding.inflate(layoutInflater)
}
private val partBinding by lazy{
ActivityPartBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding.btnShow.setOnClickListener{
val parent = partBinding.root.parent as ViewGroup?
parent?.removeAllViews()
//부모 뷰에 부분 화면을 ㅊ ㅜ가한다.
binding.addContainer.addView(partBinding.root)
}
}
}
이상으로 인플레이션 개념 포스팅을 마칩니다.
댓글