Android - 특정 뷰에 포커스 맞추기 (Kotlin)
업데이트:
- 연구주제 : Android - 특정 뷰에 포커스 맞추기 (Kotlin)
- 연구목적 : 안드로이드에서의 코틀린 활용
- 연구일시 : 2020년 02월 26일 09:00~17:00
- 연구자 : 이재환 ljh951103@naver.com
- 연구장비 : HP EliteDesk 800 G4 TWR, Kotlin, Android studio, IntelliJ
- 관련연구 : Java, Android, Kotlin, ViewPager
서론
이번 시간에는 특정 뷰에 포커스를 맞추는 부분을 다루겠다.
저번 시간에 뷰 페이저에 대해 다루었다.
만약 뷰 페이저에서 여러 페이지를 스와이핑하고 백 버튼으로 뷰 페이저를 빠져나온다면, 변경된 뷰 페이저의 화면이 아니라 클릭했을 때의 뷰 스크롤과 같을 것이다.
우리는 이것을 해결해보고자 한다.
본론
우리가 저번에 뷰 페이저로 들어가기전에 인텐트로 화면전환시 데이터를 넘겼던 것에대해 기억하는가?
recyclerAdapter =
RecyclerAdapterPhoto(this, thumbnailList) {
thumbnailData, num, image ->
Toast.makeText(this, "인덱스: ${num} 이름: ${thumbnailData.data}", Toast.LENGTH_SHORT)
.show()
val intent = Intent(this, com.example.wimmy.PhotoViewPager::class.java)
intent.putExtra("photo_num", num)
photoList.addAll(thumbnailList)
Log.d("사이즈", "${photoList.size}")
intent.putParcelableArrayListExtra("photo_list", photoList)
startActivityForResult(intent, 100)
}
그렇다. 우리는 클릭한 해당 사진의 인덱스 값을 넘겨서 뷰 페이저의 해당 사진으로 바로 이동이 가능했다.
마찬가지로 값을 이전 액티비티로 얻어올 수도 있다.
위의 코드와 같이 startActivityForResult(intent, 100)
를 하며 화면전환을 한다.
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) { }
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
if(check == false ) {
viewPager.setCurrentItem(index, false)
check = true
}
subimg!!.setImageResource(0) // 애니메이션
tb.visibility = View.VISIBLE
bt.visibility = View.VISIBLE
}
override fun onPageSelected(position: Int) {
check_index = position
text_name.setText(photoList[position].data)
}
})
뷰 페이저의 페이지 스크롤 리스너에서 페이지를 스와이프할 때 마다 그 인덱스값을 저장한다.
override fun onBackPressed() {
val intent = Intent()
intent.putExtra("index", check_index)
setResult(Activity.RESULT_OK, intent)
finish()
}
다음과 같이 백버튼 리스너를 재정의하여 백버튼을 누를 때, 저장시킨 인덱스를 다시 넘겨주도록 한다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
100 -> {
val doc = data!!.getIntExtra("index", 0)
recyclerView?.scrollToPosition(doc)
}
}
}
}
다시 포토 뷰 액티비티에서 백버튼을 눌렀을 때의 인텐트 값을 받아서 그 값으로 다음과 같이 입력한다.
recyclerView?.scrollToPosition(doc)
이 코드를 입력하게되면 해당 뷰에 맞게 스크롤이 자동조정된다.
결론
이제 코드를 실행시켜 테스트해보아라.
자동적으로 뷰에 맞게 스크롤됨을 확인할 수 있다.
향후과제
뷰 페이저와 상하단바 같이 사용하기
참고자료
https://sudalkim.tistory.com/4
Writer: Jae-Hwan Lee
댓글남기기