getActionBar返回null

时间:2012-04-05 15:07:30

标签: android android-actionbar

调用getActionBar会返回null。这经常被报道,所以我确保包含其他人使用的解决方案:我的minSdkVersion=11,我有一个标题栏,我在getActionBar之后打电话给setContentView。此外,我的活动不是儿童活动。

setContentView(R.layout.main);

// experiment with the ActionBar 
ActionBar actionBar = getActionBar();
actionBar.hide();

设备是运行Android 3.2的三星Galaxy Tab 10.1

提前感谢任何想法或建议!

14 个答案:

答案 0 :(得分:59)

您似乎需要通过主题或下面的代码请求操作栏(!=标题栏)。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Action Bar is a window feature. The feature must be requested
    // before setting a content view. Normally this is set automatically
    // by your Activity's theme in your manifest. The provided system
    // theme Theme.WithActionBar enables this for you. Use it as you would
    // use Theme.NoTitleBar. You can add an Action Bar to your own themes
    // by adding the element <item name="android:windowActionBar">true</item>
    // to your style definition.
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

    setContentView(R.layout.main);

    // experiment with the ActionBar 
    ActionBar actionBar = getActionBar();
    actionBar.hide();
}

来自[here]的代码

答案 1 :(得分:11)

为了实现这一点,似乎需要满足几个条件。那个困扰我很久的人是:

确保您的活动扩展了Activity(NOT ActionBarActivity)。

public class MagicActivity extends Activity

确保您的应用清单有类似

的内容
<application
    ...
    android:theme="@android:style/Theme.Holo" >

并确保您的活动布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ....
    android:theme="@android:style/Theme.WithActionBar" >

-Mark

答案 2 :(得分:10)

我似乎通过使用 getSupportActionBar()切换 getActionBar()来解决所有错误。 我尝试过不同的主题,添加 getWindow()。requestFeature(Window.FEATURE_ACTION_BAR); , 确保setContentView(view)是第一个以及之前看到的所有其他东西。

答案 3 :(得分:8)

操作栏需要具有应用标题的主题或活动。确保您没有将您的应用程序或活动设置为Theme.NOTITLE。

<application
    android:name="com.xxx.yyy.Application"
    android:debuggable="false"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code


<activity
        android:name="com.xxx.yyy.Activity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:theme="@style/Theme.NoTitle"  // remove this line if you have this in your code
        android:windowSoftInputMode="adjustResize|stateHidden" > 

答案 4 :(得分:4)

我试图使用支持库从ActionBarActivity内的片段中获取ActionBar。我不得不这样做:

ActionBarActivity actionBarActivity = (ActionBarActivity)getActivity();
ActionBar actionBar = actionBarActivity.getSupportActionBar();

我的下一个任务是弄清楚如何制作这个通用的。例如,这段代码感觉很脏,因为它需要我的Fragment知道ActionBarActivity正在使用它并使用支持库。我认为它应该是一个方法,如果父Activity不是ActionBarActivity,首先检查getActivity().getActionBar()后跟上面代码捕获ClassCastException。

答案 5 :(得分:2)

如果您为API14或更高版本创建应用程序项目,则会有一个values-14文件夹。确保该文件夹存在且它的styles.xml文件包含:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- API 14 theme customizations can go here. -->
</style>

我收到此错误是因为我创建了一个新项目,并且我在项目中不想要任何额外的值文件夹,所以我只保留了values文件夹并删除了值-v11和values-v14文件夹。但显然,如果要使用ActionBar,API14及更高版本的默认主题需要在其中使用ActionBar的父XML标记。所以我认为我可以做错了!希望这有助于某人。尽管如此,您最有可能通过上述答案解决问题。

答案 6 :(得分:2)

这解决了我的问题:

android.support.v7.app.ActionBar ab = getSupportActionBar();

答案 7 :(得分:1)

真正的答案应该是@zapl和@Himanshu Virmani的组合

对于Android Manifest:

<application
    android:name="com.xxx.yyy.Application"
    android:debuggable="false"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code


<activity
        android:name="com.xxx.yyy.Activity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:theme="@style/Theme.NoTitle"  // remove this line if you have this in your code
        android:windowSoftInputMode="adjustResize|stateHidden" > 

活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Action Bar is a window feature. The feature must be requested
    // before setting a content view. Normally this is set automatically
    // by your Activity's theme in your manifest. The provided system
    // theme Theme.WithActionBar enables this for you. Use it as you would
    // use Theme.NoTitleBar. You can add an Action Bar to your own themes
    // by adding the element <item name="android:windowActionBar">true</item>
    // to your style definition.
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    setContentView(R.layout.activity_main);
    // Hide the status bar for Android 4.1 and higher
    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    ActionBar actionBar = getActionBar();
    actionBar.hide();
}

答案 8 :(得分:1)

确保延长ACTIONBARACTIVITY而不是ACTIVITY 这应该可以解决你的问题

答案 9 :(得分:1)

只需改变两件事 1)清单文件编辑 机器人:主题=&#34; @android:风格/ Theme.Holo&#34; &GT;

2)片段文件添加 机器人:主题=&#34; @android:风格/ Theme.WithActionBar&#34;

答案 10 :(得分:1)

更改系统请求的顺序:

@Override
protected void onCreate(Bundle savedInstanceState) {

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);

    // experiment with the ActionBar 
    ActionBar actionBar = getActionBar();
    actionBar.hide();
}

答案 11 :(得分:0)

如果您正在开发针对sdk&gt; = 14的应用,并且您正在扩展AppCompat以支持以前版本中的Material主题。如果要隐藏操作栏中的项目(如后退按钮),则需要执行以下操作: 在你的活动中(不在片段类中) 如果你要使用getActionBar(),它将返回null。在Appsupport主题中,getSupportAcionBar()将返回操作栏。

如果您想关注DevByte

,请点击以下链接
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_detail);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);




}

答案 12 :(得分:0)

也许您的活动风格基于NoActionBar

答案 13 :(得分:0)

步骤01:

更改您的班级家长。 向AppCompatActivity的活动

即:

public class BluetoothActivity extends AppCompatActivity {
//Your Code
}

步骤02:

创建一个全局变量,如下所示。 (我正在使用androidx。所以这就是导入的样子)

androidx.appcompat.app.ActionBar actionBar;

步骤03:

使用深色的操作栏,如下所示。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Your style -->
</style>

步骤04:

分配getSupportActionBar();变量,您可以在 onCreate 方法中将其创建为全局变量。

setContentView(R.layout.activity_bluetooth);
actionBar = getSupportActionBar(); //Create this After setContentView
actionBar.show(); //this is for Experimental process only

步骤05:

现在您可以使用actionBar做任何想做的事

actionBar.setTitle("Profile");