1. SeekBar
SeekBar는 볼륨이나 밝기 같은 조정기능을 담당하는 위젯입니다.
SeekBar는 Progress와 max를 통해 SeekBar의 시작 값과 변경 가능한 최댓값을 설정할 수 있으며
다음과 같이 Listener를 구현해 변경 값을 확인할 수 있습니다.
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
})
위와 같이 메서드를 작성하고 난 후 메서드내부에 커서를 옮기고 Ctrl + I 키를 눌러줍니다. 그리고 나오는 Impements에서 모든 메서드를 선택한 뒤
OK 버튼을 눌러주면 다음과 같이 메서드가 추가됩니다.
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
TODO("Not yet implemented")
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
TODO("Not yet implemented")
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
TODO("Not yet implemented")
}
})
자동으로 추가된 TODO는 모두 삭제하거나 주석 처리합니다. 리스너에서 함수 자체는 모두 구현되어야 하므로 함수를 지워서는 안 됩니다. 그리고 현재 SeekBar의 값은 onProgressChanged메서드 내부에서 progress 매개변수 값으로 확인할 수 있습니다.
참고로 onProgressChanged 메서드에서 seekBar는 이벤트를 발생시키는 자기 자신의 위젯을 나타내며 fromUser는 사용자에 의해 직접 값이 변경되고 있는지를 알려줍니다. SeekBar도 그렇지만 대부분의 위젯은 사용자가 직접 하지 않더라도 코드를 통해서 변경하는 경우도 있기 때문에 이를 구별하려는 것 같습니다.
또한 추가된 onStartTrackingTouch와 onStopTrackingTouch메서드는 사용자가 SeekBar에 터치를 시작할때와 터치를 끝낼 때 호출되는 메서드입니다.
2. RatingBar
특별할것 없이 그냥 별점을 주는 위젯입니다.
주요 속성으로는 RatingBar에 표시할 별의 수를 정하는 numStarts과 초기 별점 값을 나타내는 rating, 사용자가 RatingBar를 드래그할 때 채워지는 별의 수를 지정하는 stepSize가 있습니다. 특히 stepSize는 0.5와 같이 소수점 단위로 설정할 수 있는데 만약 해당 속성의 값이 0.1이라면 별 하나의 10/1을 의미하게 됩니다.
RatingBar의 리스너는 SeekBar의 리스너와 거의 동일한 방법으로 추가할 수 있습니다. 우선 아래와 리스너 코드를 추가하고
ratingBar.setOnRatingBarChangeListener(object: RatingBar.OnRatingBarChangeListener{
})
리스너 안에서 Ctrl + I 키를 눌러 Implement Members를 호출한뒤 표시되는 모든(어차피 하나밖에 없지만...) 메서드를 선택한 후 OK 버튼을 눌러줍니다. 그러면 다음과 같은 코드가 완성됩니다.
ratingBar.setOnRatingBarChangeListener(object: RatingBar.OnRatingBarChangeListener{
override fun onRatingChanged(ratingBar: RatingBar?, rating: Float, fromUser: Boolean) {
TODO("Not yet implemented")
}
})
TODO를 삭제하고 대신 아래와 같이 Log를 통해 RatingBar의 값을 표시하도록 수정합니다. SeekBar와 마찬가지로 RatingBar는 이벤트를 발생시키는 자신을, rating는 현재 값, fromUser는 사용자가 드래그를 통해 직접 값을 바꾸는지의 여부를 판단하는 매개변수입니다.
ratingBar.setOnRatingBarChangeListener(object: RatingBar.OnRatingBarChangeListener{
override fun onRatingChanged(ratingBar: RatingBar?, rating: Float, fromUser: Boolean) {
Log.d("test", "현재값 : ${rating}")
}
})
다만 RatingBar에서 리스너는 조금 다른 방법으로도 구현될 수 있는데 RatingBar에서 리스너를 구현할 때 위에서 작성한 Listener 외에 fromUser -> 로 표시되어 있는 리스너를 선택하면 다음과 같이 리스너가 완성되는 것을 확인할 수 있습니다.
ratingBar.setOnRatingBarChangeListener { ratingBar, rating, fromUser -> }
-> 표기 문법을 흔히 람다식이라고 합니다. 일일이 코드를 구현하지 않더라도 어떤 걸 의미하는지 알 수 있을 때 이를 생략하여 코드를 작성하는 것을 말합니다. 즉, 람다식은 코드를 간결하게 해주는 문법적인 도구인 것이죠.
위에서 setOnRatingBarChangeListener 리스너를 구현한 뒤 Implement Members에서 구현해야 하는 함수 목록을 불러왔는데 함수 목록이 단 한 개였습니다. 이 때문에 리스너 내부에서 구체적으로 어떤 함수의 이름을 작성하지 않더라도 어차피 구현해야 하는 함수는 단 1개로 정해져 있으니 생략이 가능한 것입니다. 우리는 그저 -> 다음으로 함수의 본체만 구현하면 되는 것입니다.
ratingBar.setOnRatingBarChangeListener { ratingBar, rating, fromUser ->
Log.d("test", "현재값 : ${rating}")
}
바로 위에서 함수를 모두 작성할 때보다 코드를 훨씬 간결하게 표현할 수 있음을 알 수 있습니다.
'Mobile > Kotlin' 카테고리의 다른 글
[Kotlin] Activity (0) | 2020.12.18 |
---|---|
[Kotlin] res (0) | 2020.12.17 |
[Kotlin] 시작하기 (hello world) (0) | 2020.12.16 |
[Kotlin] 위젯 - CheckBox, ProgressBar (0) | 2020.12.16 |
[Kotlin] 위젯 - RadioGroup (0) | 2020.12.15 |