访问 TimePickerDialog 的 NumberPicker 对象而不是 Class.forName 的替代方法

Fre*_*rik 2 java android timepickerdialog

我正在尝试创建一个自TimePickerDialog定义的小时和分钟的自定义间隔,并设法通过使用这个问题的答案来解决它。

问题是 Android Studio 显示以下警告:

不支持通过反射访问内部 API,并且可能无法在所有设备上或将来使用。使用反射访问隐藏/私有的 Android API 是不安全的;它通常不适用于其他供应商的设备,并且可能会突然停止工作[...]

问题在第一行:

Class<?> classForid = Class.forName("com.android.internal.R$id");

Field timePickerField = classForid.getField("timePicker");
TimePicker mTimePicker = findViewById(timePickerField.getInt(null));
Field minuteField = classForid.getField("minute");
Field hourField = classForid.getField("hour");
NumberPicker minutePicker = mTimePicker.findViewById(minuteField.getInt(null));
NumberPicker hourPicker = mTimePicker.findViewById(hourField.getInt(null));
Run Code Online (Sandbox Code Playgroud)

我需要一些访问这两个NumberPicker对象的替代方法。

Fre*_*rik 6

我通过使用找到了解决方案Resources.getSystem().getIdentifier()

代码现在看起来像这样:

TimePicker timePicker = findViewById(Resources.getSystem().getIdentifier(
    "timePicker", 
    "id", 
    "android"
));

NumberPicker minutePicker = timePicker.findViewById(Resources.getSystem().getIdentifier(
    "minute", 
    "id", 
    "android"
));

NumberPicker hourPicker = timePicker.findViewById(Resources.getSystem().getIdentifier(
    "hour", 
    "id", 
    "android"
));
Run Code Online (Sandbox Code Playgroud)

  • 出色的。原始代码(在问题中)在 Android 11 中停止工作,但这个新代码(在答案中)在 Android 11 中工作,并且至少可以追溯到 Android 5。 (4认同)