gpt4 book ai didi

android - 如何从按钮 onclick 调用 Number Picker onvaluechange 方法?

转载 作者:搜寻专家 更新时间:2023-11-01 07:49:04 25 4
gpt4 key购买 nike

xml 中的数字选择器:

<NumberPicker
android:id="@+id/np"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_weight="1" />

这是按钮:

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="30dp"
android:text="Any text!"
android:background="@drawable/round_button" />

数字选择器上的 OnValueChangedListener:

//Set a value change listener for NumberPicker
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal){

//Statement goes here...

}
});

每当用户更改值时,onvaluechange 中的语句都会按预期执行。但我想使用按钮更新数字选择器的值。

现在,我已经为按钮设置了一个 onclicklistener:

b1 = (Button) rootView.findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Increment NumberPicker value by 1
numberPicker.setValue(numberPicker.getValue() + 1);
}
});

这行得通,它将数字选择器的值增加 1,但它不会通知数字选择器该值已更改,因此 onValueChange() 中的代码没有得到执行。只有当用户手动滚动数字选择器时,语句才会执行。我希望在单击按钮时发生同样的情况。

最佳答案

这实际上是 NumberPicker 小部件的正确行为。如果你查看它的源代码,你会看到:

public void setValue(int value) {
setValueInternal(value, false);
}

这里是 setValueInternal 方法:

private void setValueInternal(int current, boolean notifyChange) {
if (mValue == current) {
return;
}
// Wrap around the values if we go past the start or end
if (mWrapSelectorWheel) {
current = getWrappedSelectorIndex(current);
} else {
current = Math.max(current, mMinValue);
current = Math.min(current, mMaxValue);
}
int previous = mValue;
mValue = current;
updateInputTextView();
if (notifyChange) {
notifyChange(previous, current);
}
initializeSelectorWheelIndices();
invalidate();
}

如您所见,setValueInternalsetValue 方法调用并带有 notifyChange = false,这就是您的监听器未收到通知的原因。 setValueInternal 被声明为私有(private)的,因此您不能在不使用反射的情况下从您的代码中调用它。

我的建议是做这样的事情:

private class NumberPickerListener implements NumberPicker.OnValueChangeListener {

@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
//your code
}
}

然后只需声明一个 NumberPickerListener 变量并在您的点击监听器中使用它:

final NumberPickerListener numberListener = new NumberPickerListener();
numberPicker.setOnValueChangedListener(numberListener);

b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int oldValue = numberPicker.getValue();
numberPicker.setValue(oldValue + 1);
numberListener.onValueChange(numberPicker, oldValue, oldValue+1);
}
});

关于android - 如何从按钮 onclick 调用 Number Picker onvaluechange 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com