我正在使用反射在我的 NumberPicker 中调用一个方法,这是我的代码:
try {
// reflection call for
method = numberPicker.getClass().getDeclaredMethod("changeValueByOne", boolean.class);
method.setAccessible(true);
method.invoke(numberPicker, increment);
//TODO: Before finalizing should there be back-up code in one of these cases?
} catch (final NoSuchMethodException e) {
e.printStackTrace();
} catch (final IllegalArgumentException e) {
e.printStackTrace();
} catch (final IllegalAccessException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
如果 changeValueByOne 方法在 NumberPicker 中不存在(我的印象是它在较旧的 API 中不存在),我可以放置一些像 numberPicker.setValue(numberPicker.getValue() - 1);
这样的代码并从 NoSuchMethodException catch 块中删除e.printStackTrace();
以使其优雅地处理这个问题吗?
换句话说,如果 changeValueByOne 方法不存在,则不使用该方法,它将默认为 setValue。 如果它可用,我宁愿使用 changeValueByOne,因为它播放 NumberPicker 的旋转动画,我不相信 setValue 会这样做。
这是我的AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.skytbest.intervaltrainer.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
和我的build.gradle
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
NumberPicker 需要 API>=11,并且您的最低要求大于此值。因此,您不会收到NumberPicker
的编译错误,因为具有 API <11 的设备无法安装它。所以你不需要担心。
如果你想改变这个最小的API,那么你可以做一些类似的事情。
if (android.os.Build.VERSION.SDK_INT<= android.os.Build.VERSION_CODES.HONEYCOMB)
{
// use this method
}
else
{
// use this method
}