需要API级别14(当前最低级别为11)的调用

3

我一直在跟随Android官方培训计划,现在正在学习“管理活动生命周期”中的“启动活动”课程。其中有一个代码段:

public void onCreate(Bundle savedInstanceState) {

    /* ... some other stuff ... */

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

当我在我的测试应用程序中编写此代码时,我收到了来自ADT的警告:
调用需要API级别14(当前最低级别为11):android.app.ActionBar#setHomeButtonEnabled。
我的应用确实是API 11的最小级别,因为根据教程,它应该是这样的。但是为什么ADT会这么聪明地告诉我它不属于那里呢?因为调用该方法的块位于检查当前版本的块内。培训计划继续说服我这是可以接受的:
注意:仅在Android 2.0(API级别5)及更高版本上,使用SDK_INT防止旧系统执行新API的方法才能起作用。旧版本将遇到运行时异常。
但是当ADT甚至不允许我编译代码时,避免运行时错误并没有太大帮助。
2个回答

9

但是为什么ADT告诉我这个不属于那里时,它表现得如此自以为是呢?因为调用该方法的语句在检查当前版本的块内部。

是的,你添加了它,但IDE并不知道你是通过Build来检查版本的。

只需添加@SuppressLint("NewApi")即可消除错误。或者您可以创建下面的方法并在条件中使用它们:

@TargetApi(14)
private void actionAPI14() {
   getActionBar().setHomeButtonEnabled(false);
}

private void action() {
   getSupportActionBar().setHomeButtonEnabled(false);
}

您始终可以使用支持包来支持较低的API版本。


正如我在下面回答Abhishek Shukla的那样,我在之前的课程中添加了支持包。如果它应该与支持包一起工作,而不是抑制来自Lint的错误,那么肯定有其他问题... 但是,您抑制Lint错误的建议确实使其运行,所以我现在至少可以继续我的课程 :) - 3Nex
不确定是否完全清楚,但为了使用支持操作栏,您需要使用getSupportActionBar()而不是getActionBar()。在低于14的API上使用后者将失败并抛出错误。 - Ben Neill

1

为何不使用支持旧版本的 support jar?它也可在较低的 API 上运行。


我正在使用之前课程中提到的支持jar包,并且有一行代码写着import android.support.v7.app.ActionBarActivity;。由于没有报错信息,我认为这行代码应该是正常工作的。 - 3Nex
你能分享一下堆栈跟踪吗? - Abhishek Shukla
并不是这样的,因为它根本不让我编译,显示“您的项目包含错误,请在运行应用程序之前修复它们。”如果我添加抑制 Lint,则不会出现错误。 - 3Nex

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