본문 바로가기

카테고리 없음

[안드로이드][자바][2024] 왕 초보가 봐야 하는 인플레이션(inflation)

반응형

1. 인플레이션이란?

안드로이드 개발을 할때 Activity나 Fragment를 생성하게 되면 res/layout 폴더에 자동으로 xml파일이 생성이 된다. xml은 실제 화면 구성을 담당하고 java에서는 데이터 처리를 담당한다. 우리가 java에서 코드를 통해 xml 화면에 있는 값을 변경하거나 설정하기 위해서는 화면 객체를 가져와야하는데 인플레이터(Inflater)를 사용하면된다. 인플레이터를 사용하면 xml 레이아웃 파일을 뷰 객체로 변환 할 수 있다. 그리고 이 과정을 인플레이션이라고 한다.

2. 인플레이션 예시 (프로젝트 생성)

우리가 프로젝트를 맨 처음 생성했을때 볼 수있는 인플레이션은 onCreate 안에 setContentView()가 있다. 정확히는 아래처럼 써져있다. (activity_main.xml은 MainActivity 생성시 같이 생성된다)

setContentView(R.layout.activity_main);

setContentView는 R.layout.activity_main라는 레이아웃 리소스를 인플레이트(객체화 시켜서)하여 현재 액티비티의 컨텐츠 뷰로 설정한다. 이 코드가 작성이 되어야 xml 화면에있는 id를 가진 뷰들을  java코드에서 findViewById로 접근 할 수있다. 즉 xml과 java를 연결 해주는 과정이라고 생각하면된다.

이번엔 Inflater를 사용한 인플레이션 예시를 알아보겠다.

3.인플레이션 예시 (Inflater 사용)

Inflater는 보통 LayoutInflater를 사용하여 인플레이트를 할 수 있다. 인플레이션이란 xml레이아웃 파일을 뷰객체로 변환 할 수있다고 하였으니 activity_main.xml에 custrom_view.xml을 추가하는 코드를 작성해보았다.

우선 화면과 코드구성은 아래와 같다.


activity_main.xml (코드)

<LinearLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="horizontal"
    android:gravity="center">

</LinearLayout>

이 코드에서 확인해야할 것은 id를 main으로 설정했다는 것과 아무런 view설정을 하지 않았다는 것이다.

activity_main.xml (화면)


custom_view.xml (코드)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/customText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Custom"
        android:textSize="30sp" />

</LinearLayout>

custom_view는 LinearLayout View와 그 안의 TextView로 이루어져있다. id는 customText이고 text는 "Custom"으로 설정 되어있다.

custom_view.xml (화면)

 


MainActivity (코드)

public class MainActivity extends AppCompatActivity {

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

        LayoutInflater inflater = getLayoutInflater();
        View customView = inflater.inflate(R.layout.custom_view,null);

        TextView textView = customView.findViewById(R.id.customText);

        textView.setText("ChangedCustom");

        LinearLayout mainlayout = findViewById(R.id.main);
        mainlayout.addView(customView);



    }
}

위의 코드는 custom_view.xml를 inflate를 통해 custom 객체에 접근하여 customText의 값을 변경후 main layout에 추가하는 과정이다.

한줄씩 자세한 설명을 하자면
setContentView(R.layout.activity_main);
=> activity_main.xml을 현재 액티비티의 컨텐츠 뷰로 설정

LayoutInflater inflater = getLayoutInflater();
=> getLayoutInflater(); 현재 액티비티의 LayoutInflater 인스턴스를 얻음 ( 흰 도화지를 얻는 것이라고 생각하면 이해하기 편합니다.)

View customView = inflater.inflate(R.layout.custom_view, null);
=> custom_view.xml을 인플레이트(객체화 시켜서)하여 View 객체로 만듭니다. (흰 도화지에 custom_view라는 그림을 그림)

TextView textView = customView.findViewById(R.id.textView);
=> 인플레이트된 customView에서 textView속성 참조 (그림에서 textView라는 부분을 포커싱)

textView.setText("Customtom");
=> textView값 변경 (textView라는 일부분을 다른 그림으로 수정)

LinearLayout mainlayout = findViewById(R.id.main);
=> activity_main.xml에 정의된 main 레이아웃을 참조 (activity_main.xml에서 main이라는 큰 영역을 찾아서 가져옴)

mainlayout.addView(customView);
=> main 레이아웃에 customView를 추가 (해당 영역에 새로 그린 customView 그림을 붙임)

앱 실행 결과

앱을 실행하면 인플레이션을 통해 변경한 텍스트 값인 ChangedCustom가 나오게 된다. 

반응형