尝试下一个代码。当 API 不可访问时将使用反射:
public void setNumberPickerTextColor(final NumberPicker numberPicker, final int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
numberPicker.setTextColor(color);
}
else {
final int count = numberPicker.getChildCount();
for (int i = 0; i < count; i++) {
final View child = numberPicker.getChildAt(i);
if (child instanceof EditText) {
try {
((EditText)child).setTextColor(color);
numberPicker.invalidate();
final Field fieldSelectorWheelPaint = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
boolean isAccessible = fieldSelectorWheelPaint.isAccessible();
fieldSelectorWheelPaint.setAccessible(true);
final Paint paint = (Paint)fieldSelectorWheelPaint.get(numberPicker);
if (paint != null){
paint.setColor(color);
fieldSelectorWheelPaint.setAccessible(isAccessible);
numberPicker.invalidate();
}
final Field fieldSelectionDivider = numberPicker.getClass().getDeclaredField("mSelectionDivider");
isAccessible = fieldSelectionDivider.isAccessible();
fieldSelectionDivider.setAccessible(true);
fieldSelectionDivider.set(numberPicker, null);
fieldSelectionDivider.setAccessible(isAccessible);
numberPicker.invalidate();
}
catch (Exception ex) {
// Ignore
}
}
}
}
}
您可以在第一次获得对该控件的引用时调用此方法,此外,如果滚动后颜色没有持续存在,则挂钩侦听器,例如 next:
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(final NumberPicker picker, final int oldVal, final int newVal) {
setNumberPickerTextColor(numberPicker, Color.RED);
}
});
或者,您也可以挂钩滚动侦听器,尽管上面的 setOnValueChangedListener 示例更加优化,因为它只会在值更改时执行更新。要改进下一个滚动方法,您可以检查scrollState是否处于空闲状态,因此仅在滚动结束时调用它:
numberPicker.setOnScrollListener(new NumberPicker.OnScrollListener() {
@Override
public void onScrollStateChange(final NumberPicker numberPicker, final int scrollState) {
setNumberPickerTextColor(numberPicker, Color.RED);
}
});
UPDATE:
下一部分仅针对您更新的问题代码。
问题是您正在扩展 NumberPicker 类,在这种情况下您需要使用获取声明字段 on the 超一流。我的上述答案只能在不扩展 NumberPicker 类时使用。
此外,您还放置了是可访问的在错误的行中,需要稍微靠前才能访问。
接下来是对代码的更正,可以在扩展 NumberPicker 类时完美使用。你可以看到获取声明字段前面是超类, and 是可访问的位于正确的位置:
private fun setNumberPickerTextColor(numberPicker: NumberPicker, color: Int) {
if (VERSION.SDK_INT >= VERSION_CODES.Q) {
numberPicker.textColor = color
} else {
val count = numberPicker.childCount
for (i in 0 until count) {
val child = numberPicker.getChildAt(i)
if (child is EditText) {
try {
child.setTextColor(color)
val fieldSelectorWheelPaint = numberPicker.javaClass.superclass.getDeclaredField("mSelectorWheelPaint")
fieldSelectorWheelPaint.isAccessible = true
val paint = fieldSelectorWheelPaint[numberPicker] as Paint
paint.color = color
numberPicker.invalidate()
} catch (ex: java.lang.Exception) {
// Ignore
}
}
}
}
}