일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 한달독서
- 한달브런치북만들기
- 1일1커밋
- 안드로이드
- 테트리스
- 목적중심리더십
- 좌식테이블
- 끝말잇기
- 재택근무
- 캐치마인드
- 아비투스
- 면접
- 소프시스 밤부 좌식 엑슬 테이블
- 함수형 프로그래밍
- 지지않는다는말
- 한달어스
- 자취필수템
- 커스텀린트
- 브런치작가되기
- 베드테이블
- 어떻게 나답게 살 것인가
- 리얼하다
- 북한살둘레길
- T자형인재
- 프래그먼트
- 베드트레이
- 소프시스
- 목적 중심 리더십
- 슬기로운 온라인 게임
- 한단어의힘
- Today
- Total
정상에서 IT를 외치다
[Android, ViewPager] 프래그먼트 뷰페이저 만들기 본문
안녕하세요. 블랙진입니다.
뷰페이저는 아래 보이는 이미지와 같이 좌우 드래그를 통해 화면이 변하는 뷰입니다.
다양한 방법으로 뷰페이저를 만들 수 있지만 이번에는 Fragment 를 사용한 뷰페이저를 만들어 보겠습니다.
1. MainAcitivty 에서 viewPager 에 adapter 를 설정합니다.
class MainActivity : AppCompatActivity() {
private val adapter by lazy { MainAdapter(supportFragmentManager) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
vpMainActivity.adapter = MainActivity@adapter
}
}
저는 코틀린 익스텐션을 사용하기 때문에 별다른 변수 선언 없이 xml 에서 viewPager 변수를 바로 가져와 사용할 수 있습니다.
(vpMainActivity 는 viewpager 의 id 값입니다.)
- activity main
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">
<android.support.v4.view.ViewPager
android:id="@+id/vpMainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
2. ViewPager 에 띄울 Fragment 를 선언합니다. (저는 5개의 A ~ D Fragment 를 만들었습니다.)
여기서 Fragment 는 아래를 상속할 수 있도록 합니다.
import android.support.v4.app.Fragment
class AFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_main, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//뷰 설정
tvFragmentMain.text = "A Fragment"
}
}
참고) A ~ D Fragment 모두 동일한 Xml 을 사용하고 textView 통해 구분 합니다. (각 각 따로 xml 을 만드셔도 됩니다.)
- fragment_main
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/tvFragmentMain"
android:textSize="20dp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
3. 마지막으로 MainAdapter 을 만들면 5개의 화면으로 구성된 ViewPager 가 완성됩니다.
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
class MainAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getItem(position: Int): Fragment? {
return when(position) {
0 -> AFragment()
1 -> BFragment()
2 -> CFragment()
3 -> DFragment()
4 -> EFragment()
else -> null
}
}
// 생성 할 Fragment 의 개수
override fun getCount() = 5
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
super.destroyItem(container, position, `object`)
//Log.e("FragmentPagerAdapter", "destroyItem position : $position")
}
}
이번 예제에서는 MainAdapter 에서 FragmentStatePagerAdapter 을 상속해서 만들었습니다.
하지만! FragmentPagerAdapter 를 상속하여 뷰페이저를 만들 수 있습니다. 이 둘의 차이에 대해 궁금하실 수도 있을 것 같아 따로 포스팅을 준비했으니 본인의 프로젝트에 맞는 뷰페이저를 만들어 멋지게 코딩하시기 바랍니다.~!~!
FragmentStatePagerAdapter 와 FragmentPagerAdapter 의 차이
연관 포스팅)
번외) setOffScreenPageLimit 에 대한 탐구
setOffScreenPageLimit 를 변경한 MainAcitivty 의 모습
class MainActivity : AppCompatActivity() {
private val adapter by lazy { MainAdapter(supportFragmentManager) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
vpMainActivity.adapter = MainActivity@adapter
vpMainActivity.offscreenPageLimit = 2
}
위에서 설명 했을 때 뷰페이저는 좌우 1개의 화면 미리 생성하고 그 이외의 화면은 제거합니다.
따라서 setOffScreenPageLimit의 default 값은 1이 되는데요. 이 값을 2로 설정하면 좌우 2개의 화면을 미리 생성하게 됩니다.
색칠한 화면이 현재 보고 있는 화면 입니다.
A - B - C / 초기 우측 B, C 화면 생성
A - B - C - D / B 로 스와이프하면 D가 생성
B - C - D - E / D 로 스와이프하면 A는 제거 됨(위 예제는 화면이 5개 까지 이므로 생성 x, 만약 화면이 더 많으면 6번 화면이 생성됨)
C -D -E / 마지막으로 E로 스와이프하면 B는 제거된다. 우측에는 생성할 뷰가 없고 좌측으로는 2개의 뷰가 남게된다.
'안드로이드' 카테고리의 다른 글
[Android, bitmap] 비트맵에 대한 탐구_이미지 자르기 (0) | 2018.09.06 |
---|---|
[Android, Indicator] 뷰 페이저에 인디케이터 달기 (0) | 2018.09.05 |
[Android] 그라데이션 효과 적용하기 (0) | 2018.08.31 |
[Android, Databinding] BindingAdapter 사용해 보기 (0) | 2018.08.28 |
[Android, Proguard] 안드로이드 프로가드 설정하기 (10) | 2018.08.24 |