2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

ViewPager 내부에서 Fragment를 사용한 아키텍처 구성하기.

_____
Q1: ViewPager 내부에서 Fragment를 사용하는 이유는 무엇인가요?
A1: ViewPager는 여러 페이지를 스와이프하며 전환할 수 있는 UI 컴포넌트입니다. 각 페이지를 Fragment로 구현하면 생명주기 관리가 편리하고, 화면 전환 시 상태 유지와 유연한 구성 변경이 용이해집니다.

---

Q2: ViewPager와 Fragment를 함께 사용하려면 어떤 어댑터를 사용해야 하나요?
A2: `FragmentPagerAdapter`, `FragmentStatePagerAdapter` (AndroidX 이전), 여전히 AndroidX 사용 시 `FragmentStateAdapter` (ViewPager2)에 적합합니다.
- `FragmentPagerAdapter`: 모든 Fragment를 메모리에 유지하며 빠른 전환에 적합하지만 메모리 부담이 큼
- `FragmentStatePagerAdapter`: 필요 없는 Fragment를 메모리에서 제거, 상태만 저장해 메모리 효율적임
- ViewPager2에서는 `FragmentStateAdapter`만 지원

---

Q3: ViewPager와 Fragment를 어떻게 연동하나요? 기본적인 코드 예시는?
A3:
```kotlin
class MyPagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getCount(): Int = 3 // 페이지 개수

override fun getItem(position: Int): Fragment {
return when(position) {
0 -> FirstFragment()
1 -> SecondFragment()
2 -> ThirdFragment()
else -> throw IllegalStateException("Invalid position")
}
}
}

// Activity 또는 Fragment에서
val viewPager: ViewPager = findViewById(R.id.viewPager)
viewPager.adapter = MyPagerAdapter(supportFragmentManager)
```

ViewPager2 사용 시:
```kotlin
class MyPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
override fun getItemCount() = 3
override fun createFragment(position: Int): Fragment = when (position) {
0 -> FirstFragment()
1 -> SecondFragment()
2 -> ThirdFragment()
else -> throw IllegalStateException()
}
}

// Activity 또는 Fragment에서
val viewPager2: ViewPager2 = findViewById(R.id.viewPager2)
viewPager2.adapter = MyPagerAdapter(this)
```

---

Q4: Fragment 내부에서 ViewPager의 현재 페이지를 어떻게 알 수 있나요?
A4: ViewPager의 `currentItem` 속성을 사용합니다.
```kotlin
val currentPage = viewPager.currentItem
```
또는 ViewPager2 같은 경우도 동일합니다.

---

Q5: Fragment 생명주기와 ViewPager에서 메모리 관리 관련 주의점은?
A5:
- `FragmentPagerAdapter`는 모든 Fragment를 메모리에 유지하므로 페이지가 많으면 메모리 문제 발생 가능
- `FragmentStatePagerAdapter` / `FragmentStateAdapter`는 화면에 보이지 않는 Fragment를 destroy하므로 메모리 절약 가능
- Fragment 생명주기를 고려하여 UI 상태 저장 및 복원 작업을 꼼꼼히 해야 함
- 백스택 및 Fragment 통신 시 ViewPager 컨텍스트를 명확히 관리해야 함

---

Q6: 각 Fragment에 데이터를 전달하거나 Fragment 간 통신은 어떻게 하나요?
A6:
- Fragment 생성 시 `Bundle`을 이용해 인수를 전달 (e.g., `newInstance()` 패턴 사용)
- ViewPager 부모 Activity나 Fragment에서 이벤트를 받아 각 Fragment와 통신
- ViewModel과 LiveData를 이용해 공유된 상태 관리가 권장됨
- 직접 Fragment 참조를 얻어 메서드를 호출하는 것은 권장하지 않음 (유지보수 및 생명주기 문제 발생)

---

Q7: ViewPager 내부 Fragment를 동적으로 추가하거나 제거할 수 있나요?
A7:
가능하지만, `getCount` 및 Fragment 리스트를 관리하는 어댑터를 직접 구현해야 하며, 데이터 변경 후 `notifyDataSetChanged()`를 호출해야 합니다.
ViewPager의 기본 어댑터들은 동적 변경에 한계가 있으므로, `FragmentStateAdapter`(ViewPager2)와 함께 `List`를 관리하는 커스텀 어댑터 작성이 일반적입니다.

---

Q8: ViewPager2를 사용하는 게 적합한 이유는?
A8:
- ViewPager2는 RecyclerView 기반으로 더 유연하고 성능 개선됨
- 수평뿐 아니라 수직 스와이프 지원
- FragmentStateAdapter를 기본으로 지원하며 효율적인 Fragment 관리 가능
- 생명주기와 상태 관리가 개선됨
- 기존 ViewPager의 여러 한계와 이슈가 해결됨

---

Q9: Fragment 내부에서 ViewPager를 사용 시 메모리 누수 가능성은 어떻게 방지하나요?
A9:
- Context 저장 시 Activity가 아닌 Application Context 사용 권장
- Fragment의 뷰 바인딩은 `onDestroyView()`에서 해제
- 참조하는 객체가 필요 이상으로 오래 유지되지 않도록 관리
- ViewPager 어댑터에 불필요한 참조를 남기지 않도록 주의

---

Q10: ViewPager와 마찬가지로 FragmentPagerAdapter 사용 시 setUserVisibleHint() 메서드는 어떻게 처리하나요?
A10:
- `setUserVisibleHint()`는 deprecated 되었고, Fragment의 Lifecycle Observer 또는 `FragmentTransaction.setMaxLifecycle()`을 사용하는 것이 권장
- ViewPager2에서는 `FragmentTransaction.setMaxLifecycle()`로 페이지의 활성화 상태를 관리
- Fragment의 `onResume()`, `onPause()` 메서드와 함께 UI 갱신을 관리해야 함

---

이상이 ViewPager 내부에서 Fragment를 사용하는 아키텍처 구성과 관련된 주요 FAQ입니다.
ViewPager를 사용하여 Fragment를 전환하는 아키텍처를 구성하는 것은 Android 애플리케이션 개발에서 매우 일반적입니다.

이를 통해 사용자가 여러 화면을 슬라이드 방식으로 탐색할 수 있습니다.

이 글에서는 ViewPager와 Fragment를 활용한 기본적인 아키텍처 구성 방법을 설명하겠습니다.

1. 기본 프로젝트 설정 Android Studio에서 새 프로젝트를 생성한 후, `build.gradle` 파일에서 필요한 라이브러리를 추가합니다.

일반적으로 `AndroidX`의 `ViewPager2`를 사용하는 것을 추천합니다.

```groovy dependencies { implementation 'androidx.viewpager2:viewpager2:1.0.0' implementation 'androidx.fragment:fragment:1.3.6' } ```

2. 레이아웃 파일 작성 MainActivity의 레이아웃 파일에서 `ViewPager2`를 추가합니다.

```xml ```

3. Fragment 생성 여러 개의 Fragment 클래스를 만듭니다.

예를 들어, 세 개의 Fragment를 만들어 보겠습니다.

```kotlin // FirstFragment.kt class FirstFragment : Fragment(R.layout.fragment_first) // layout 파일 작성 필요 // SecondFragment.kt class SecondFragment : Fragment(R.layout.fragment_second) // layout 파일 작성 필요 // ThirdFragment.kt class ThirdFragment : Fragment(R.layout.fragment_third) // layout 파일 작성 필요 ```

4. FragmentAdapter 생성 ViewPager에 Fragment를 연결하기 위해 `FragmentStateAdapter`를 구현한 Adapter 클래스를 생성합니다.

```kotlin class ViewPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { override fun getItemCount(): Int = 3 // Fragment 수 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> FirstFragment() 1 -> SecondFragment() 2 -> ThirdFragment() else -> throw IllegalStateException("Unexpected position $position") } } } ```

5. MainActivity 설정 `ViewPager2`에 Adapter를 설정하여 ViewPager가 Fragment를 표시하게 합니다.

```kotlin class MainActivity : AppCompatActivity() { private lateinit var viewPager: ViewPager2 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewPager = findViewById(R.id.viewPager) val adapter = ViewPagerAdapter(this) viewPager.adapter = adapter } } ```

6. Fragment 레이아웃 작성 각 Fragment에 대한 레이아웃 파일을 작성합니다.

```xml ``` 이와 같이 `fragment_second.xml`과 `fragment_third.xml`도 작성합니다.



7. 추가적인 설정 (선택적) - 탭 추가 : `TabLayout`과 `ViewPager2`를 함께 사용하여 탭 인터페이스를 구현할 수 있습니다.

- 상태 관리 : `ViewModel`을 사용하여 데이터를 공유하고 상태를 관리할 수 있습니다.

- 애니메이션 : Fragment 전환 시 애니메이션을 추가하여 사용자 경험을 향상시킬 수 있습니다.

이로써 ViewPager 내부에서 Fragment를 사용한 기본 아키텍처 구성이 완료되었습니다.

이를 기반으로 더 복잡한 기능을 추가하여 애플리케이션을 발전시킬 수 있습니다.

작성자: 박지안 [비회원] | 작성일자: 1년 전 2025-04-03 07:01:25
조회수: 177 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.