79616644

Date: 2025-05-11 15:38:49
Score: 1
Natty:
Report link

If you're using OnSliderTouchListener, here’s a solution that works using reflection:

fun setValueAndClick(value: Int): ViewAction {
    return object : ViewAction {
        override fun getDescription(): String? {
            return "Set value and trigger onStopTrackingTouch."
        }

        override fun getConstraints(): Matcher<View?>? {
            return isAssignableFrom(Slider::class.java)
        }

        override fun perform(uiController: UiController?, view: View) {
            val slider = view as Slider
            slider.value = value.toFloat()

            // Slider extends BaseSlider
            val baseSliderClass = slider.javaClass.superclass

            // BaseSlider contains "List<T> touchListeners"
            val touchListenersField: Field = baseSliderClass.getDeclaredField("touchListeners")
            touchListenersField.isAccessible = true

            val listeners = touchListenersField.get(slider) as? List<*>
            val listener = listeners?.find { it is Slider.OnSliderTouchListener }

            if (listener == null) throw Exception("${Slider.OnSliderTouchListener::class.simpleName} not found.")

            for (method in listener.javaClass.declaredMethods) {
                if (method.name == "onStopTrackingTouch") {
                    method.isAccessible = true
                    method.invoke(listener, slider)
                    break
                }
            }
        }
    }
}

Usage Example:
onView(withId(R.id.set_number_slider)).perform(setValueAndClick(10))

If you want to trigger onStartTrackingTouch, just replace "onStopTrackingTouch" in the code with "onStartTrackingTouch".

I couldn't find a cleaner approach—many solutions online rely on imprecise adjustments with magic numbers. At least this one uses reflection and reliably triggers the required listener.

Reasons:
  • Blacklisted phrase (1.5): any solution
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (0.5):
Posted by: CalmPerson