【问题标题】:Adding a listener to a number picker widget向数字选择器小部件添加侦听器
【发布时间】:2012-12-20 13:18:45
【问题描述】:

我正在努力将数字选择器集成到我的应用程序中。该活动显示一个项目列表,每个项目都有一个数字选择器。用户可以使用数字选择器增加或减少数量。当他们这样做时,我想更新一个显示价格的 TextView。

我在尝试实现这一目标时遇到了困难。我做了一个简单的项目,并尝试在用户单击小部件时显示吐司消息,但无济于事。

我的猜测是数字小部件没有被视为按钮,因此点击侦听器不起作用?对于添加听众的任何建议,我将不胜感激。

下面是我的代码:

NumberPicker np;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    np = (NumberPicker)findViewById(R.id.numberPicker1);
    np.setMaxValue(99);
    np.setMinValue(0);
    np.setValue(50);

    np.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Number selected", Toast.LENGTH_SHORT).show();
        }
    });
}

【问题讨论】:

  • 如果你想要的只是点击事件,你可能需要做np.setClickable (true)。但是,如果您想监听号码变化,为什么不使用OnValueChangeListener

标签: android onclicklistener numberpicker


【解决方案1】:

您需要将NumberPicker.setOnValueChangedListener 设置为通知NumberPicker 的当前值的变化

看看这个example我们如何为NumberPicker设置setOnValueChangedListener

【讨论】:

    【解决方案2】:

    要使用Picker 设置侦听器,您的活动必须实现选择器接口侦听器。 (其实你的activity并不是强制实现接口的,你也可以使用匿名的inner方法。随便什么都行。)

    所以在你的活动中:

    public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            NumberPicker np = (NumberPicker)findViewById(R.id.numberPicker1);
            np.setMaxValue(99);
            np.setMinValue(0);
            np.setValue(50);
            np.setOnValueChangedListener(this);
    
        }
    
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            Toast.makeText(this, "change", Toast.LENGTH_SHORT).show();
        }
    }
    

    【讨论】:

    • 它适用于您将侦听器附加到的任何类。如果您不想修改课程,请使用@nitsujri 的答案
    【解决方案3】:

    对于较新的 Android 开发人员(如我),Activity 本身不需要来实现侦听器。它只需要传入setOnValueChangedListener()

    这有助于避免过多的implements 和过多的重叠@Overrides

    例子:

    // Number Picker
    NumberPicker np = (NumberPicker) getView().findViewById(R.id.numberPicker1);
    np.setMinValue(0);
    np.setMaxValue(35);
    
    np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker numberPicker, int i, int i2) {
    
            Toast.makeText(this, "Value was: " + Integer.toString(i) + " is now: " + Integer.toString(i2), Toast.LENGTH_SHORT).show();
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2014-01-30
      • 2011-08-16
      • 2014-02-08
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多