Android NumberPicker OnValueChangeListener

Posted

技术标签:

【中文标题】Android NumberPicker OnValueChangeListener【英文标题】: 【发布时间】:2013-05-11 13:44:24 【问题描述】:

我有一个关于 android NumberPicker 的问题。 当用户在 NumberPicker 上执行 Fling 时,每一步都会触发 OnValueChange 的侦听器。我可以这样改变吗,oldVal 和 newVal 之间的差异可能超过 1 并且 Listener 只触发一次?

提前致谢。

编辑: 我将尝试在我的代码中更具体地解释它。

        int diff = Math.abs(newVal - oldVal);

        if (newVal - oldVal > 0) 
            sendMessage(te);
            for (int i = 0; i < diff; i++) 
                sendMessage(plus);
            
            sendMessage(te);
         else if (newVal - oldVal < 0) 
            sendMessage(te);
            for (int i = 0; i < diff; i++) 
                sendMessage(minus);
            
            sendMessage(te);
         else 
            if (D)
                Log.w(TAG, "This should NEVER happen");
        

此方法称为 inonValueChange。它发送消息的速度太快,以至于我连接的设备无法及时做出反应。所以我需要以任何方式放慢速度。有谁知道如何在不让我的主线程休眠的情况下减慢它的速度?当它处于睡眠状态时,整个 GUI 在此期间没有响应。我尽量避免这种情况。

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用setOnScrollListener 代替setOnValueChangedListener,并在滚动状态为SCROLL_STATE_IDLE 时获取选择器的值。检查这个例子:

    numberPicker.setOnScrollListener(new NumberPicker.OnScrollListener() 

        private int oldValue;  //You need to init this value.

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) 
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) 
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            
        
    );

请注意,您需要在侦听器中初始化 oldValue 变量的值。如果你需要创建一个通用的监听器(可以接收任何值的数组),你可以创建一个实现NumberPicker.OnScrollListener的自定义类,并在构造函数中接收初始值。像这样的:

    public class MyNumberPickerScrollListener implements NumberPicker.OnScrollListener 

        private int oldValue;

        public MyNumberPickerScrollListener(int initialValue) 
            oldValue = initialValue;
        

        @Override
        public void onScrollStateChange(NumberPicker numberPicker, int scrollState) 
            if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) 
                //We get the different between oldValue and the new value
                int valueDiff = numberPicker.getValue() - oldValue;

                //Update oldValue to the new value for the next scroll
                oldValue = numberPicker.getValue();

                //Do action with valueDiff
            
        
    

阅读NumberPicker.onScrollListener 文档了解更多信息。

【讨论】:

这还没有解决我的问题。我想做的是:只要它是一扔什么都不做。当它停止时,获取新值与投掷前值之间的差异。使用该值执行一些功能。此外,我想要相同的功能,当值仅通过单击而更改为 1 时,而不是一掷千金。每次以任何方式更改时,我都需要发送许多命令,这些命令与差异一样高。 查看更新后的响应是否符合您需要实施的内容 ;-) 2013 年添加,2021 年仍然有用 :)

以上是关于Android NumberPicker OnValueChangeListener的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 Android NumberPicker 小部件,但我不知道如何从 NumberPicker 设置值

NumberPicker 不适用于键盘

没有闪烁光标的Android NumberPicker

Android零基础入门第58节:数值选择器NumberPicker

在 Android 中将 OnValueChange 实现为 NumberPicker

更改 NumberPicker 分隔线颜色不适用于 Android Api 29+