레이아웃 인플레이션

2022. 4. 23. 19:36·개발/Android
반응형

안드로이드에서 어떤 뷰를 Activity(화면)에 띄우려면 반드시 객체화가 되어야 한다.

인플레이션이란 XML 레이아웃에 정의된 내용(뷰)이 메모리에 객체화되는 과정이다.

이 과정을 간단하게 말하면 

  1. UI를 디자인할 XML 파일 작성을 완료하면,
  2. 이후 setContentView 메소드에서 XML 레이아웃 파일을 매핑한다.
  3. 그러면 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)
        }
    }
}

 

이상으로 인플레이션 개념 포스팅을 마칩니다.

반응형
'개발/Android' 카테고리의 다른 글
  • Intent(인텐트)
  • Context
  • 리니어 레이아웃(LinearLayout)과 상대 레이아웃(RelativeLayout)
  • 제약 레이아웃(Constraint Layout)
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    토비의 스프링
    컨테이너
    redis
    리눅스
    도커
    코딩 #개발자 #노마드북클럽 #노개북
    spring boot
    JPA
    AWS
    자바
    Java
    스프링
    test
    SQL
    AOP
    인덱스
    객체
    객체지향
    spring mvc
    ORM
    container
    데이터베이스
    spring
    운영체제
    docker
    스프링 부트
    innodb
    프록시
    트랜잭션
    mysql
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
레이아웃 인플레이션
상단으로

티스토리툴바