개요

안드로이드에서 시크바(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에 선택된 값을 출력하는 역할을 합니다.
  • 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"
    }
}