개요
안드로이드에서 시크바(SeekBar) 사용자가 슬라이더를 통해 값을 조정할 수 있도록 하는 위젯입니다.
사용자는 슬라이더의 핸들을 드래그하여 값의 범위 내에서 값을 변경할 수 있으며, 일반적으로 볼륨, 밝기, 진행 상태 등을 조절할 때 사용됩니다. SeekBar
는 ProgressBar
를 확장한 클래스이며, 사용자가 직접 값을 변경할 수 있는 차이점이 있습니다.
예제 코드
import android.os.Bundle
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// SeekBar 변경 리스너 설정
binding.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
// 사용자가 값 변경할 때 호출
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
binding.valueTextView.text = "현재 값: $progress"
}
// 사용자가 터치로 SeekBar를 조작하기 시작할 때 호출
override fun onStartTrackingTouch(seekBar: SeekBar?) {
// 필요한 경우 동작 처리 가능
}
// 사용자가 터치 조작을 마쳤을 때 호출
override fun onStopTrackingTouch(seekBar: SeekBar?) {
// 필요한 경우 동작 처리 가능
}
})
}
}
설명
- SeekBar 설정
binding.seekBar.setOnSeekBarChangeListener()
를 사용하여SeekBar
의 상태 변화를 감지합니다.OnSeekBarChangeListener
는 세 가지 콜백 메서드로 구성되어 있습니다:onProgressChanged()
는 사용자가 슬라이더를 움직여 값을 변경할 때 호출됩니다.onStartTrackingTouch()
는 사용자가 슬라이더를 터치하기 시작할 때 호출됩니다.onStopTrackingTouch()
는 사용자가 터치 동작을 끝냈을 때 호출됩니다.
- onProgressChanged()
- 사용자가 SeekBar의 핸들을 움직일 때마다
onProgressChanged()
가 호출되어progress
값을 얻습니다. - 이 값은 현재
SeekBar
의 진행 상황을 나타내며, 여기서TextView
에 선택된 값을 출력하는 역할을 합니다.
- 사용자가 SeekBar의 핸들을 움직일 때마다
- fromUser 플래그
onProgressChanged()
메서드의fromUser
매개변수는 사용자가 직접 값을 변경했는지 여부를 알려줍니다. 시스템 또는 프로그램적으로 값이 변경된 경우false
가 됩니다.
- SeekBar 기본 속성
SeekBar
의 기본 값은0
부터max
까지의 값으로 설정됩니다. 이를 XML 레이아웃 파일에서 설정하거나 코드에서 설정할 수 있습니다.
fromUser 조건의 활용
fromUser
플래그는 사용자가 직접 슬라이더를 조작했는지 여부를 나타내며, 코드나 시스템에서 변경한 경우에는 false
가 됩니다.
따라서, 이 조건을 추가하면 사용자가 직접 값을 변경한 경우에만 동작하도록 설정할 수 있습니다. 이는 프로그램적으로 SeekBar의 값을 변경할 때와 구분할 수 있는 방법이 됩니다.
다음과 같이 fromUser
조건을 추가하면 됩니다:
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
binding.valueTextView.text = "현재 값: $progress"
}
}