[안드로이드]/[안드로이드] 공부 기록

[안드로이드] 인플레이션(inflation), 부분화면

노트포미 2023. 9. 26. 00:01

인플레이션(inflation)

: XML 레이아웃에 정의된 내용이 메모리에 객체화되는 과정

ex) xml레이아웃에 정의된 button을 안드로이드 시스템이 메모리에 만들어주는 것

 

- setContentView가 레이아웃 인플레이션 해줌

   -> findViewById() 가 setContentView()보다 먼저 작성되면, 에러가 발생함

 

setContentView()

: xml과 java를 이어주는 함수

- 화면에 나타날 뷰를 지정하는 역할

- XML 레이아웃의 내용을 메모리 상에 객체화 하는 역할

 

setContentView(R.layout.레이아웃 파일 이름);

* 안드로이드는 한 쌍의 xml과 java가 Activity 하나를 이룸

    (xml : 디자인, java : 실행방법)

 

- setContentView()는 전체화면을 지정

  -> 부분화면만 사용할 때는, LayoutInflater 서비스를 사용해야함

 

LayoutInflatier

: 부분화면으로 새로운 xml을 넣을 때, inflation할 수 있게 해주는 것

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.sub1, container, true);
//sub1.xml은 부분화면에 사용할 xml
//container은 activity_main.xml에 sub.xml을 넣을 FrameLayout
//true는 바로 실행

 

-> activity_main.xml의 버튼을 누르면, sub1.xml이 부분화면으로 실행되는 앱 만들기

#MainActivity.java

package com.example.mylayoutinflater;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

public class MainActivity extends AppCompatActivity {

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

        //Inflater가 없어서 Sub1.xml에 있는 sub_Button은 객체화되지 않음
        Button button1 = (Button) findViewById(R.id.sub_Button);

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

        Button button = (Button) findViewById(R.id.button);
        button.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);

                //sub1.xml의 inflater를 생성했기 때문에 sub_Button이 객체화 됨
                Button subButton = (Button) findViewById(R.id.sub_Button);
            }
        });
    }
}

#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/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="409dp"
        android:layout_height="665dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button">

    </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

#sub1.xml (res->layout->sub1.xml)

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="부분화면"
        android:textSize="30dp"/>

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

</LinearLayout>

 

sub1.xml
실행화면