Search code examples
androidkotlinseekbarrx-binding

setOnSeekBarChangeListener with rxBinding


How can I use rxBinding to call setOnSeekBarChangeListener?

My code :

    view?.seekBarDisplay?.setOnSeekBarChangeListener(object :
                SeekBar.OnSeekBarChangeListener {
                override fun onProgressChanged(seekBar: SeekBar, 
    progress: Int, fromuser: Boolean) {

                   val backLightValue = (progress / 100f)
                   val layoutParams = activity?.window?.attributes
                   layoutParams?.screenBrightness = backLightValue
                   activity?.window?.attributes = layoutParams
                }

               override fun onStartTrackingTouch(seekBar: SeekBar) {}

               override fun onStopTrackingTouch(seekBar: SeekBar) {}
           })

Solution

  • As RxBinding 4.0 released, you have 4 options to implement the Seekbar using it:

    1. the SeekBar.changeEvents(): with subscribing to this observable, you'll get notified when onProgressChanged, onStartTrackingTouch, and onStopTrackingTouch methods get called.

    2. SeekBar.changes(): Notifies you only when any changes happen to the seekbar.

    3. SeekBar.userChanges(): Notifies you only when any changes happen to the seekbar by User itself.

    4. SeekBar.systemChanges(): Notifies you only when any changes happen to the seekbar by the system.

    you can subscribe to these function as other usual Observables.

    Here is a sample of the first method:

    yourSeekBar.changes()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { seekBarChangeEvent ->
                when (seekBarChangeEvent) {
                    is SeekBarProgressChangeEvent -> {}
                    is SeekBarStartChangeEvent -> {}
                    is SeekBarStopChangeEvent -> {}
                }
            }