2

我正在开发一个应用程序,并且我有一个带有项目的布局,当按下这些项目时,会在它们下方显示一个 NumberPicker,如下所示:

在此处输入图像描述

我正在使用本机 Android NumberPicker。NumberPickers 以可见性开始,GONE当按下它们上方的项目时,它们的可见性会被切换。但是,我发现,如果用户在它仍在滚动时尝试以这种方式关闭选择器(例如,在选择器上用力滑动,然后在它仍在滚动时立即按下项目以关闭该选择器)会导致选择器陷入无限循环,冻结并最终使应用程序崩溃。记录onValueChangedListenerNumberPicker 会显示以下日志:

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 之前,我尝试了几种不同的方法来停止它的滚动。到目前为止没有一个工作。我试过(没有特别的顺序)

  • 调用setValueNumberPicker 的最后一个已知值,认为这可能会停止滚动
  • setEnabled(false)在隐藏 NumberPicker 之前调用
  • performClick()在隐藏 NumberPicker 之前调用
  • dispatchTouchEvent(...)在隐藏 NumberPicker 之前调用
  • 调用jumpDrawablesToCurrentState()NumberPicker 及其父视图
  • scrollBy(0, 0)在隐藏 NumberPicker 之前调用

在所有情况下,滚动动画都不会受到影响,并且在尝试隐藏选择器时应用程序会冻结。

有什么办法可以停止 NumberPicker 的滚动,这样我就可以隐藏视图而不会出现这个循环问题?或者也许有一种方法可以安全地隐藏和显示选取器,而不会导致它们以这种方式循环?

谢谢

4

0 回答 0