向数字选择器小部件添加监听器

11

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

当我尝试实现此功能时遇到了困难。我创建了一个简单的项目,并尝试在用户单击小部件时显示toast消息,但没有成功。

我猜测数字小部件不像按钮那样处理,因此无法使用单击侦听器?希望能得到有关添加侦听器的任何建议。

以下是我的代码:

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();
        }
    });
}

2
如果你只想要点击事件,那么你可能需要执行 np.setClickable(true)。然而,如果你想监听数字变化,为什么不使用 OnValueChangeListener 呢? - A--C
4个回答

23

为了使用Picker设置监听器,您的活动必须实现选择器接口监听器。(实际上,您的活动并不强制要求实现接口,也可以使用匿名内部方法。无论哪种方法都可以。)

因此,在您的活动中:

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的答案。 - Zyoo

10

对于像我这样的新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();

    }
});

2

0

使用 Kotlin(使用 Lambda 函数)

val numberPicker : NumberPicker = binding.yourNumberPicker // Using DataBinding

numberPicker.maxValue = 99
numberPicker.minValue = 0
numberPicker.value    = 50 // Initialized selected value
numberPicker.setOnValueChangedListener { picker, oldVal, newVal ->

    Toast.makeText(activity, "Number selected. Old: $oldVal New: $newVal",Toast.LENGTH_SHORT).show()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接