자바 안드로이드 앱개발 강좌, 프래그먼트 – 액티비티처럼 동작하는 뷰

안드로이드 애플리케이션 개발에서는 사용자 인터페이스(UI)를 구축하는 데 있어 다양한 구성 요소를 사용합니다. 이 중에서도 프래그먼트(Fragment)는 액티비티(Activity)와 함께 중요한 역할을 맡고 있는 구성 요소입니다. 본 강좌에서는 프래그먼트의 기본 개념, 사용법, 장점, 예제 코드를 포함하여, 실전에서 프래그먼트를 어떻게 응용할 수 있는지 심도 있게 살펴보겠습니다.

1. 프래그먼트란?

프래그먼트는 UI의 일부를 구성하는 모듈입니다. 여러 가지 장점이 있는 프래그먼트는 복잡한 UI를 보다 쉽게 관리할 수 있도록 도와주며, 액티비티보다 가벼운 구조를 가지고 있습니다. 프래그먼트는 액티비티 내에서 여러 번 재사용될 수 있으며, 다양한 화면 크기와 방향 (세로/가로)에 맞춰 다르게 구성될 수 있는 유연성을 제공합니다.

2. 프래그먼트의 특징

  • 재사용성: 여러 액티비티에서 동일한 프래그먼트를 재사용할 수 있어 코드 중복을 줄일 수 있습니다.
  • 모듈화: UI의 각 부분을 프래그먼트로 모듈화하여 관리하기 쉬운 구조를 만들 수 있습니다.
  • 동적 UI: 런타임 중에 프래그먼트를 추가하거나 제거하여 동적으로 UI를 관리할 수 있습니다.
  • 생명주기 관리: 프래그먼트는 자체 생명주기를 가집니다. 이는 사용자 인터페이스의 상태를 쉽게 관리할 수 있도록 돕습니다.

3. 프래그먼트의 생명주기

프래그먼트는 액티비티와 별도로 생명주기를 관리하지만, 액티비티의 생명주기에 의존합니다. 다음은 프래그먼트의 주요 생명주기 메서드입니다:

  • onAttach: 프래그먼트가 액티비티에 연결될 때 호출됩니다.
  • onCreate: 생명주기에서 최초 생성 시 호출됩니다.
  • onCreateView: 프래그먼트의 UI를 생성할 때 호출됩니다.
  • onActivityCreated: 액티비티와 프래그먼트의 초기화가 완료될 때 호출됩니다.
  • onStart: 프래그먼트가 화면에 보일 준비가 되었을 때 호출됩니다.
  • onResume: 프래그먼트가 사용자와 상호작용할 준비가 되었을 때 호출됩니다.
  • onPause: 사용자와의 상호작용이 일시 중단될 때 호출됩니다.
  • onStop: 프래그먼트가 더 이상 화면에 보이지 않을 때 호출됩니다.
  • onDestroyView: 프래그먼트의 UI가 제거될 때 호출됩니다.
  • onDetach: 프래그먼트가 액티비티와 연결이 끊어질 때 호출됩니다.

4. 프래그먼트 만들기

프래그먼트를 만드는 과정은 매우 간단합니다. 우선, 프래그먼트 클래스를 정의한 후, XML 레이아웃 파일을 생성하여 UI를 구성합니다. 아래의 예제에서 프래그먼트를 만들어 보겠습니다.

4.1. 프래그먼트 클래스 생성


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_my, container, false);
    }
}

4.2. 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:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello from MyFragment!" />

</LinearLayout>

5. 프래그먼트를 액티비티에 추가하기

프래그먼트를 만든 후에는 이를 액티비티에 추가해야 합니다. 프래그먼트를 동적으로 추가하거나 XML 레이아웃에 정적으로 추가할 수 있습니다. 아래의 예제는 동적으로 프래그먼트를 추가하는 방법을 보여줍니다.

5.1. 액티비티 레이아웃에 프래그먼트가 들어갈 공간 확보하기


<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /
>

5.2. 액티비티 클래스에서 프래그먼트 추가하기


import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyFragment myFragment = new MyFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.fragment_container, myFragment);
        transaction.commit();
    }
}

6. 프래그먼트 간 데이터 전달하기

프래그먼트 간에 데이터를 전달하려면 Bundle을 사용할 수 있습니다. 이 방법을 사용하면 액티비티에서 프래그먼트를 생성할 때 데이터를 전달할 수 있습니다. 아래 예제에서는 프래그먼트에 데이터를 전달하는 방법을 보여줍니다.

6.1. 프래그먼트에 데이터 전달


public static MyFragment newInstance(String data) {
    MyFragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putString("key", data);
    fragment.setArguments(args);
    return fragment;
}

6.2. 프래그먼트 내부에서 데이터 받기


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        String data = getArguments().getString("key");
        // 데이터를 사용하여 UI 업데이트
    }
}

7. 프래그먼트 생명주기 관리

프래그먼트의 생명주기를 관리하는 것은 매우 중요합니다. 올바른 시점에 UI를 업데이트하거나 데이터를 가져오는 것이 필요합니다. 예를 들어, 사용자가 프래그먼트를 볼 준비가 되면 데이터를 가져오는 코드를 실행할 수 있습니다.


@Override
public void onStart() {
    super.onStart();
    // 프래그먼트가 화면에 보일 때 데이터를 가져옵니다
    loadData();
}

8. 백스택에 프래그먼트 추가하기

백스택 기능은 사용자가 프래그먼트를 탐색할 때 이전 프래그먼트로 쉽게 돌아갈 수 있도록 도와줍니다. 프래그먼트를 추가할 때 `addToBackStack()` 메서드를 사용하여 활성화할 수 있습니다.


FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container, myFragment);
transaction.addToBackStack(null);
transaction.commit();

9. 프래그먼트의 장점 및 단점

9.1. 장점

  • 모듈화된 UI로 유지보수성이 향상됩니다.
  • 동적 UI를 통해 다양한 화면에 적응할 수 있습니다.
  • 재사용이 가능하여 코드 중복을 줄입니다.

9.2. 단점

  • 프래그먼트와 액티비티 간 생명주기 관리를 신경 써야 합니다.
  • 복잡한 UI 구조를 만들 경우 오히려 관리가 어려워질 수 있습니다.

10. 결론

프래그먼트는 안드로이드 애플리케이션 개발에서 매우 유용한 구성 요소입니다. UI를 모듈화하고 재사용성을 높이며, 다양한 화면 크기에 적합한 흥미로운 사용자 경험을 제공하는 데 중점을 둡니다. 본 강좌에서 살펴본 내용을 바탕으로, 여러분의 안드로이드 애플리케이션에 프래그먼트를 효과적으로 활용해 보시길 바랍니다.

11. 참고 자료