반응형
ViewPager
- 좌우로 스와프 하면서 View를 전환하는 AdapterView
- 화면이 바뀌는 것이 아니라 화면 크기만한 View를 생성해 View 들을 전환하는 개념
- 현재는 업그레이드 버전인 ViewPager2 제공 (ViewPager, ViewPager2 모두 정상 작동 -> ViewPager : View 전환시 ViewPager2 : 프래그먼트 전환시 사용)
- PagerAdapter 를 구현해 사용하고 아래 4개의 메소드를 오버라이딩
- getCount() : ViewPager2로 보여줄 View의 전체 개수
- instantiateItem : ViewPager로 보여줄 View 객체를 생성
- isViewFromObject : instantiateItem 에서 만든 객체(View 객체 이외의 부가적인 객체들을 더 만듬)를 사용할 것인지의 여부를 결정
- destroyItem : ViewPager 에서 View가 사라질 때 제거하는 작업
ViewPager 주요 이벤트
- PageChange : ViewPager에서 View가 전환시 반응하는 리스너
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
// ViewPager를 통해 View들을 담을 리스트
val viewList = ArrayList<View>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) //뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
val view1 = View1Binding.inflate(layoutInflater).root //레이아웃 정보를 가지고 뷰객체 생성 가능
//val view = LayoutInflater.inflate(R.layout.view1, null)이 안먹히는 이유?? root에 이 뷰객체가 붙음
val view2 = View2Binding.inflate(layoutInflater).root
val view3 = View3Binding.inflate(layoutInflater).root
val view4 = View1Binding.inflate(layoutInflater).root
val view5 = View2Binding.inflate(layoutInflater).root
val view6 = View3Binding.inflate(layoutInflater).root
viewList.add(view1)
viewList.add(view2)
viewList.add(view3)
viewList.add(view4)
viewList.add(view5)
viewList.add(view6)
val adapter1 = object : PagerAdapter() {
// ViewPager가 보여줄 View의 개수
override fun getCount(): Int {
return viewList.size
}
//ViewPager가 보여줄 화면에 필요한 View를 생성/반환
override fun instantiateItem(container: ViewGroup, position: Int): Any {
binding.pager1.addView(viewList[position])
return viewList[position]
}
//instantiateItem 이 반환한 객체를 화면에서 사용할 것인가를 검사
override fun isViewFromObject(view: View, `object`: Any): Boolean { // object 키워드가 이미 존재하는데 같은 이름으로 변수를 사용하고 싶을때 `` 사용
//`object` : instantiateItem 이 반환한 객체
// view : 뷰객체 -> 뷰페이저에서 뭔가 작업할때 들어오는 것 같음
//위 두 변수가 같은지 확인
/* instantiateItem 는 뷰페이저에 쓰일 뷰객체 뿐만 아니라 안드로이드 os와 관련된 객체도 반환하여 이 메소드의 인자로 들어옴
* -> 뷰페이저에서 뭔가 작업을 할때 해당 화면의 뷰객체가 인자 view 로 들어오고, 동시에 instantiateItem 가 반환한 객체가 os 객체가 아니라 뷰페이저에 보여줄 뷰와 들어온 객체가 일치하는지를 확인하는 작업
* -> view 매개변수로 사용하고자 하는 뷰페이저 뷰까지 들어오는 마당에 왜 이딴걸 하는지는 모르겠으나,,,,,문서에 딱히 명시 x
* 내 생각엔 instantiateItem 가 뷰를 생성해 이 메소드에 전달함과 동시에 다른 os 뷰들이 같이 여기에 들어오면서 동기화 문제?... 아닌가 싶음...
*/
return view == `object`
}
// ViewPager 에서 없앨 View 객체를 소멸 //없앨거란건 어케 앎?
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
binding.pager1.removeView(`object` as View)
}
}
binding.pager1.adapter = adapter1
binding.pager1.addOnPageChangeListener(listener1)
}
val listener1 = object : ViewPager.OnPageChangeListener {
// 페이지 스크롤 상태가 변경되었을 대 호출
override fun onPageScrollStateChanged(state: Int) {
}
// 페이지의 스크롤이 끝났을 때 호출 (첫실행부터 나옴)
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
binding.textView.text = "${position} 번째 View가 나타남"
}
// 페이지를 선택했을 대 호출 (한번 스크롤해야 나옴)
override fun onPageSelected(position: Int) {
binding.textView2.text = "${position} 번째 View 를 선택함"
}
}
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/AdapterView] MultiAutoCompleteTextView (0) | 2023.02.27 |
---|---|
[안드로이드/AdapterView] AutoCompleteTextView (0) | 2023.02.27 |
[안드로이드/AdapterView] Spinner (0) | 2023.02.24 |
[안드로이드/AdapterView] Custom Adapter (0) | 2023.02.23 |
[안드로이드/Widget] 다양한 view/widget & 사용법 (0) | 2023.02.20 |