【问题标题】:Call requires API level 11(current min is 9) android.app.Activity#onCreateView调用需要 API 级别 11(当前最低为 9) android.app.Activity#onCreateView
【发布时间】:2015-08-30 08:20:17
【问题描述】:

在 SDK 更新 (23) 之后,我收到了这个 lint 错误,我没有对我的代码进行任何更改,它在 api 级别 9 的设备上运行良好。而且我不调用 android.app.Activity #onCreateView 在我的代码中。如果我单击自动修复,它会将 @SuppressLint("NewApi") 放入类 @SuppressLint("NewApi") public class MyActivity extends android.support.v4.app.FragmentActivity 的声明中,这样错误就会消失,我想确定这是否是正确的方法。

【问题讨论】:

标签: android lint


【解决方案1】:

我也遇到了同样的问题。

如果您查看 Activity 类 (http://developer.android.com/reference/android/app/Activity.html#onCreateView%28android.view.View,%20java.lang.String,%20android.content.Context,%20android.util.AttributeSet%29) 的 javadoc,您会看到方法 public View onCreateView (View parent, String name, Context context, AttributeSet attrs) 在 API 11 中添加。

我没有在类声明级别使用 @SuppressLint("NewApi") ,而是将该特定方法添加到我的代码中并抑制了方法声明的 lint 警告。像这样:

@SuppressLint("NewApi")
public View onCreateView(View parent, String name, Context context, AttributeSet attrs)
{
    if(Build.VERSION.SDK_INT >= 11)
      return super.onCreateView(parent, name, context, attrs);
    return null;
}

这样,未来对类代码的任何添加仍将由 lint 进行检查,但 lint 将停止将此方法标记为错误。

ETA:类的 Javadoc 表明这两个 onCreateView(...) 方法都返回 null 作为默认行为,并且 API 11 之前的方法有一个空实现。

【讨论】:

  • 这是一个非答案,因为他们的代码根本不调用/覆盖onCreateView。这是 Android SDK 中的一个错误; here is the issue to star.
  • @nkorth, onCreateView 由 android 调用,'当使用 getSystemService(Class) 返回的 LayoutInflater 进行充气时'。 api 文档就在那里,在我提供的链接中,您没有费心阅读。其次,问题是关于使用@SuppressLint 来抑制警告,而不是关于错误的来源。但是感谢您找到对它的引用。
【解决方案2】:

@SuppressLint("NewApi") 是 Android Lint 工具使用的注解。

您的代码中的某些内容不是最优的或可能会崩溃。通过在那里传递 NewApi,您可以抑制所有警告,这些警告会告诉您是否使用在 minSdkVersion 之后引入的任何 API

欲了解更多信息并做出决定,请查看 Android Lint Checks:HERE

你也可以使用@TargetApi。

不同之处在于,使用 @TargetApi,您可以通过参数声明您在代码中处理的 API 级别,这样如果您稍后修改方法以尝试引用比 API 更新的内容,错误可能会再次弹出@TargetApi 中引用的级别。

@TargetApi 是更好的注解,允许您以更细粒度的方式告诉构建工具“好的,我修复了此类问题”。

【讨论】:

  • 实际上我根本不想使用注释,我也不需要它们,因为我的代码根本不使用 Activity#onCreateView。由于 android api 本身引发了错误。我正在尝试为 android 自己的错误找到最佳解决方法。你的回答很有帮助,谢谢你,但它没有回答我的实际问题。
【解决方案3】:

正如 user5292387 所提到的,添加了 oncreateview。而不是抑制我使用的 lint

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) 
{
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
        super.onCreateView(parent, name, context, attrs) : 
        super.onCreateView(name, context, attrs);   
}

第一次调用 super 是针对运行 Honeycomb Android OS 及更高版本的设备。第二次调用 super 是针对运行低于 Honeycomb Android OS 的设备。我认为它看起来更干净,而不是返回 null。但是,android 文档确实声明返回 null 将导致默认行为。任何一种解决方案都应该有效,但是我对返回 null 持怀疑态度,因为这可能会对 Android SDK 的后续版本产生不利影响。

【讨论】:

    【解决方案4】:

    似乎每个人都缺少的东西是他正在使用来自 v4 支持库的 FragmentActivity。根据定义,这个类应该一直兼容到 Android API 4。不应该发出警告,因为 FragmentActivity 提供了自己的 onCreateVivew() 实现。

    在我看来这是一个 Lint 错误。

    我认为 @SupressLint("NewAPI") 是解决 Lint 错误的最简单方法(因为我根本不相信这是一个错误)。还要记住,Lint 错误不是编译错误。它们是给您的建议,说明您的代码中可能存在问题,或者有更好的方法来解决。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多