Я работаю над приложением, и у меня есть макет с элементами, которые при нажатии показывают под ним NumberPicker, например:
Я использую родной Android NumberPicker. NumberPickers начинаются с видимости GONE
, и их видимость переключается при нажатии элемента над ними. Тем не менее, я обнаружил, что если пользователь пытается закрыть средство выбора таким образом, когда оно все еще прокручивается (например, сильно ударить по средству выбора, а затем сразу же нажать элемент, чтобы закрыть это средство выбора, пока оно все еще прокручивается), то оно вызывает застрять в бесконечном l oop, замораживая и в конечном итоге сбой приложения. Регистрация onValueChangedListener
для NumberPicker показывает следующие журналы:
2020-03-25 16:13:39.545 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 4
2020-03-25 16:13:39.545 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 5
2020-03-25 16:13:39.545 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 6
2020-03-25 16:13:39.545 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 7
2020-03-25 16:13:39.558 30393-30393/com.example.expandablepicker.debug W/View: requestLayout() improperly called by android.widget.NumberPicker$CustomEditText{f549769 IFED..CL. ......I. 0,0-1080,10 #1020386 android:id/numberpicker_input} during layout: running second layout pass
2020-03-25 16:13:39.560 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 6
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 5
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 4
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 3
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 2
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 1
2020-03-25 16:13:39.561 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 0
2020-03-25 16:13:39.569 30393-30393/com.example.expandablepicker.debug I/chatty: uid=10345(com.example.expandablepicker.debug) identical 283 lines
2020-03-25 16:13:39.569 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 0
2020-03-25 16:13:39.569 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 0
2020-03-25 16:13:39.569 30393-30393/com.example.expandablepicker.debug I/ExpandingPickerItem: value change, 0
2020-03-25 16:13:39.572 30393-30393/com.example.expandablepicker.debug I/chatty: uid=10345(com.example.expandablepicker.debug) identical 93 lines
Я также реализовал версию этого, где изменение видимости NumberPicker анимировано, поэтому оно расширяется и входит вместо того, чтобы быть просто раскрытым , Я реализовал это с помощью анимации, которая изменила высоту NumberPicker. В этом случае сборщик останавливается примерно на половине анимации закрытия, точно так же, как он останавливается с изменением видимости.
Я пытался сделать несколько разных вещей, чтобы остановить прокрутку NumberPicker, прежде чем я пытаюсь закрыть его. Никто до сих пор не работал. Я пытался (без определенного порядка)
- вызывать
setValue
к последнему известному значению NumberPicker, думая, что может просто остановить прокрутку - , вызывая
setEnabled(false)
, прежде чем скрыться NumberPicker - , вызывающий
performClick()
перед тем, как скрыть NumberPicker - , вызывающий
dispatchTouchEvent(...)
перед тем, как скрыть NumberPicker - , вызывающий
jumpDrawablesToCurrentState()
в NumberPicker и его родительском представлении - вызов
scrollBy(0, 0)
перед сокрытием NumberPicker
Во всех случаях анимация прокрутки не изменялась, и приложение зависало при попытке скрыть средство выбора.
Есть ли Как я могу остановить прокрутку NumberPicker, чтобы я мог скрыть представление без этой проблемы зацикливания? Или, может быть, есть способ безопасно скрыть и раскрыть сборщики, не вызывая их l oop таким образом?
Спасибо