Android getActionBar和getSupportActionBar有什么区别?

11

这是我的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){

    //android.support.v7.app.ActionBar actionBar = getSupportActionBar();
    //actionBar.setTitle("Android");

    ActionBar actionBar = getActionBar();
    actionBar.setTitle("Droid");
}

使用getSupportActionBar()时,我的应用在KitKat和其他新版本上运行良好,但使用getActionBar会导致错误。

以下是错误信息:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.hide()' on a null object reference
            at com.github.domain.geoquiz.QuizActivity.onCreate(QuizActivity.java:57)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372

为什么会这样?来自Android文档:

注意:务必从适当的包中导入ActionBar类(及其相关API):

如果支持低于11级的API:

import android.support.v7.app.ActionBar

如果只支持API级别为11或更高级别:

import android.app.ActionBar

现在为什么这个应用程序崩溃了呢?


如果您正在使用支持库,应该依赖于 getSupportActionBar() 方法。您用于测试的 Android 版本是什么? - andrew
2个回答

14
如果您正在使用AppCompat,无论您的应用程序在运行哪个Android版本,都必须调用getSupportActionBar()
您的目标是哪些Android版本?
我建议您使用新的工具栏而不是ActionBar,因为它更加灵活易用。

不,我没有使用AppCompat。我正在Android 4.4.4上测试我的应用程序。我会研究工具栏,但我想知道这个错误的原因。 - Amit Tripathi
好的,如果你正在导入SupportActionBar,你总是需要调用 getSupportActionBar() - carstenbaumhoegger
我刚刚看到styles.xml中使用了AppCompat。那么,这是问题所在吗? - Amit Tripathi
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> - Amit Tripathi
AppCompat是保持兼容性的正确选择。SupportLibrary会为您处理ActionBar,您可以在此处查看SupportLibs的不同功能。 - carstenbaumhoegger
显示剩余2条评论

5
如果您扩展了“AppCompatActivity”,则为旧版Android提供后向支持,因此必须使用“getSupportActionBar()”函数。如果您导入“android.app.ActionBar”,则必须使用“getActionBar()”函数,如果您导入“android.support.v7.app.ActionBar”,则必须使用“getSupportActionBar()”函数。
请注意:通过使用“android.support.v7.app.ActionBar”,可以为旧版Android提供后向支持。

谢谢您的回答。我对 getActionBar(产生 null)和 getSupportActionBar(正常工作)感到困惑。我的应用程序包含 import androidx.appcompat.app.AppCompatActivity - 它是自动创建的,而不是我自己创建的。我在评论和答案中看到 ActionBar 已经过时,并被 ToolBar 取代。将我的应用程序(正在开发中)迁移到新技术是否值得? - Spectorsky
1
@Spectorsky 当可行时,删除已弃用/过时的代码并迁移到最新实现总是值得的!当该代码在未来的SDK中完全被移除时,您将更加安全。 :) - Chintan Shah
谢谢回复!一般来说,从“ActionBar”迁移到“ToolBar”需要做什么?我不打算使用工具栏,除非菜单(如果在工具栏中)和返回按钮。 - Spectorsky
@Spectorsky 这可能会有帮助:https://developer.android.com/training/appbar/setting-up - Chintan Shah

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