getActionBar returns null

2019-01-03 09:55发布

Calling getActionBar returns null. This has been frequently reported so I've made sure to include the solutions others have used: My minSdkVersion=11, I do have a titlebar, and I'm calling getActionBar after setContentView. Also, my activity is not a child activity.

setContentView(R.layout.main);

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

Device is a Samsung Galaxy Tab 10.1 running Android 3.2

Thanks in advance for any ideas or suggestions!

13条回答
Emotional °昔
2楼-- · 2019-01-03 10:13

If you create an application project for API14 or above, there will be a values-14 folder. Make sure that folder exists and it has a styles.xml file with:

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

I got this error because I created a new project and I didn't want any extra values folders in my project, so I just kept the values folder and removed the values-v11 and values-v14 folders. But apparently the default theme for API14 and above requires an ActionBar in it's parent XML tag if you want to use the ActionBar. So I assumed I could do that incorrectly! Hope this helps somebody. Your most likely to resolve your issues with the above answers though.

查看更多
beautiful°
3楼-- · 2019-01-03 10:15

Action bar needs theme or activity with app title to be there. Make sure you have not styled your application or activity as 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" > 
查看更多
Emotional °昔
4楼-- · 2019-01-03 10:15

I was trying to get the ActionBar from within a fragment inside an ActionBarActivity using the support library. I had to do this:

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

My next quest is to figure out how to make this generic. For example, this code feels dirty because it requires my Fragment to know both that it's being used by an ActionBarActivity and using the support library. I think it should be a method that checks getActivity().getActionBar() first followed by the code above catching the ClassCastException if the parent Activity is not an ActionBarActivity.

查看更多
做自己的国王
5楼-- · 2019-01-03 10:20

It seems you need to request having an Actionbar (!= titlebar) either via a Theme or via below code.

@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();
}

Code from [here]

查看更多
再贱就再见
6楼-- · 2019-01-03 10:23

Change the order of system request:

@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();
}
查看更多
三岁会撩人
7楼-- · 2019-01-03 10:32

It seems there are several conditions which need to be met in order for this to work. The one which stumped me for a long time was this:

Make sure your activity extends Activity (NOT ActionBarActivity).

public class MagicActivity extends Activity

Make sure your app manifest has something like

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

and make sure your activity layout has

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

-Mark

查看更多
登录 后发表回答