如何仅在特定的API级别上执行代码

21

例如,这段代码:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {

  myCalendarView.setOnDateChangeListener(
    new OnDateChangeListener() {

      @Override
      public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
        Toast.makeText
        (
          getApplicationContext(), ""+dayOfMonth, 0
        ).show();        
      }

    }
  );

}  

出现错误:

  

描述       资源     路径             位置                        类型     调用需要API级别11(当前最低级别为8):     android.widget.CalendarView#setOnDateChangeListener    example.java        /example/src/com/example/example    line 20    Android Lint问题

我知道为什么在编译时会出现这个错误。但是有没有办法标记源Java类只在某些API级别-11上使用?或者将代码块包围在define /类似的东西中,以便代码只在API级别-11以上的设备上进行延迟绑定/ Jitted? 如何实现我的目标的最佳解决方案? (就是在能够支持CalendarView的设备上提供一个Activity。)


你所做的很好。 - Raghav Sood
很不幸,当我在Eclipse中编译时,出现了所描述的错误。(意思是我可以编译和测试代码) - Tom
1
那是一个lint错误。您可以在首选项中禁用它。您的应用程序仍将正常运行。 - Raghav Sood
3
将鼠标悬停在错误上,并添加@SuppressLint("NewAPi")。 - gpasci
2
谢谢。我知道TargetApi和SupressLint! - Tom
2个回答

35

我不确定这是否能解决你的问题,

但是你正在使用的版本检查方法在 API 9 下不起作用(而你支持的最低 API 版本为 8)。

你应该使用:

if (Build.VERSION.SDK_INT > 9) { 

或者作为有问题的功能是 API 11,检查 "SDK_INT>10"。

然后对于在 Eclipse 上的 lint 错误,按照其他人的评论禁用 lint 错误或者将 @SuppressLint("NewAPi") 或目标添加到该函数中以适配 11 版本。


4
你可以使用Build.VERSION_CODES常量与SDK版本进行比较,而不是硬编码:if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {} - Farshad Tahmasbi

3
对于那些稍后才能找到的人,根据 API 版本在运行时有条件地执行代码目前是支持不同平台版本的有效方式。 参见:https://developer.android.com/training/basics/supporting-devices/platforms#version-codes 文中写道: Android 在 Build 常量类中为每个平台版本提供了一个唯一的代码。在您的应用程序中使用这些代码构建条件,以确保依赖于较高 API 级别的代码只在系统上可用这些 API 时执行。并给出了示例:
Java:
private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

Kotlin:

private fun setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        actionBar.setDisplayHomeAsUpEnabled(true)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接