[Android] Fragment에서 Activity view pager 변경 + 개발 일지

 

[개발 일지]

 

코틀린으로 일정 관리 앱을 개발 중이었다.

4가지 기능이 필요했다.

1.  달력의 한 날짜를 클릭하면 그와 관련된 slide view를 다른 class에서 처리하도록 하기

2.  slide view의 내부 view 들을 그려주기

3. view all goals 클릭 시 view pager의 2번째 탭(1번 인덱스)로 이동,

4.  add routine 클릭 시 view pager의 3번째 탭(2번 인덱스)로 이동

 

[Slide View를 나타낼 CalendarSlider 생성]

 

class CalendarSlider(
    slideLayout: SlideLayoutCalendarBinding,
    private val mainActivity: MainActivity
)

 

CalendarSlider은 2가지 value-parameter를 받는다.

slideLayout은 아래와 같이 해당 일에 대한 일정 관리 layout이다. 

해당 layout을 넘겨줘서 view를 그릴 수 있게 해준다.

 

slide layout

 

mainActivity도 넘겨주는데 viewpager에 접근하려면 fragment들을 관리하는

mainActivity를 통해 선언 된 viewpager에 접근할 수 있게 해준다.

 

[sldie view 구성요소 불러오기]

 

private val topTextView = slideLayout.todoTopText
private val editTypingView = slideLayout.todoEditText
private val addButton = slideLayout.todoAddButton
private val goAllGoalsButton = slideLayout.todoViewAllGoals
private val goAddRoutineButton = slideLayout.todoAddRoutine
private val recentlyListRecycler = slideLayout.todoRecentlyList

 

위에 있는 slide layout에 속해있는 view들을 선언해준다. 

뷰를 그리거나 버튼 클릭에 대한 이벤트를 처리할 수 있다.

 

뷰를 그려줄 (초기화 해줄) initView를 만들어준다.

 

fun initView(dateTime: String,day: String){
    val topText = dateTime+" "+ day + "일 일정"
    topTextView.text = topText
}

 

외부에서 initView를 통해서 뷰들을 초기화 해줄 수 있다.

우선 상단의 "xx년 xx월 x일 일정" 만 그려주었다. 

외부에서 dateTime (년도, 월) , day (일)을 받아온다.

 

[view all goals, add routine 버튼 클릭 이벤트 처리하기]

[Fragment에서 Activity view pager 변경]

 

버튼 클릭 이벤트를 처리하기 위한 setUpListner를 만들어준다.

 

fun setUpListener(){
    goAllGoalsButton.setOnClickListener {
        mainActivity.viewPager.currentItem= 1
    }
    goAddRoutineButton.setOnClickListener {
        mainActivity.viewPager.currentItem = 2
    }
}

 

앞의 3,4 번 기능을 구현했다.

버튼을 클릭 시 mainActivity의 viewPager를 조작할 수 있다.

 

viewPager.currentItem

 

viewPager에서 인덱스에 해당하는 fragment로 이동하는 동작을 currentItem을 통해서 할 수 있다.

방법은 fragment에 해당하는 인덱스로 이동하면 된다.

 

 

[클래스 사용하기]

 

CalendarSlider에 넘겨줄 slideLayout을 선언한다. (binding 내부의 slide Layout)

이 후에 앞에서 구현한 initView()와 setUpListener()을 실행

 

val slideLayout = binding.slideLayout
val calendarSlider = CalendarSlider(slideLayout,mainActivity)
calendarSlider.initView(dateTime,day)
calendarSlider.setUpListener()

 

클릭 시 slide view , add routine 클릭 시 viewpager 3번째 탭으로 이동