Android TimePicker 方法是存根

Android TimePicker methods being stubs

(我不确定其他人是否遇到过这个问题,但我确实遇到过) 我正在访问 android.widget.TimePicker 的 setHour(int)getHour()(以及分钟的 getter 和 setter)——IntelliJ 不会抱怨它们不存在,但是当我 运行 来自我的 phone(或模拟器)的程序崩溃了,我看到了 java.lang.NoSuchMethodError android.widget.TimePicker.getHour 的错误日志。 (其他 minute/hour getter/setter 包括)。 我尝试访问 TimePicker class (Ctrl+B) 的定义,我意识到每个方法都包含一行:throw RuntimeException("Stub"); 那这是什么;我该如何继续前进?

IntelliJ doesn't complain of their inexistence

那是因为您正在针对 API 级别 23 进行编译。

but when i run the program from my phone (or emulator) it crashes and i see an error log of java.lang.NoSuchMethodError android.widget.TimePicker.getHour

那是因为 getHour() was added in API Level 23,而您的设备或模拟器是 运行 Android 5.2 或更低版本。

我不使用 IntelliJ,但它应该抱怨你的构建。在 Eclipse 和 Android Studio 中,您会从 Lint 收到一个错误,指示您正在调用一个方法 (getHour()),该方法存在于您的 compileSdkVersion (23) 但不存在于您的 minSdkVersion(无论您将其设置为什么,作为您愿意支持的最旧 API 级别)。

I tried accessing the definition for the TimePicker class (Ctrl+B) and I realised every method contained a line: throw RuntimeException("Stub")

那是因为它正在反编译编译时类路径中的 android.jar,它纯粹由存根实现组成以满足 javac编译器。在运行时,您的进程的 VM 将有一个具有实际实现的 JAR 版本。

How can I move on?

可能会停止调用 getHour(),除非你只能在 Android 6.0+ 设备上这样做。