getActionBar returns null

纵然是瞬间 提交于 2019-12-27 11:05:25

问题


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!


回答1:


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]




回答2:


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




回答3:


I seemed to solve all my errors by switching getActionBar() with getSupportActionBar(). I had tried different themes, adding getWindow().requestFeature(Window.FEATURE_ACTION_BAR);, made sure the setContentView(view) was first and all the other things seen before.




回答4:


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" > 



回答5:


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.




回答6:


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.




回答7:


This fixed my issue:

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



回答8:


The real answer should be combination of both @zapl and @Himanshu Virmani

For 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" > 

For Activity:

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



回答9:


Make sure you extend ACTIONBARACTIVITY and not ACTIVITY This should solve your problem




回答10:


just change two thing 1) manifest file edit android:theme="@android:style/Theme.Holo" >

2) Fragment file add android:theme="@android:style/Theme.WithActionBar"




回答11:


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



回答12:


In case when you are developing an app which is targeting sdk>=14 , and you are extending AppCompat to support Material theme in previous versions also . When you want to hide the items from your action bar like the back button you need to do this : In your activity (not in the fragment class) If you will you use getActionBar() it will return null. as in Appsupport theme getSupportAcionBar() will return the action bar.

Here is the link if you want to follow from DevByte

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

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




}



回答13:


maybe your activity's style is based NoActionBar



来源:https://stackoverflow.com/questions/10031180/getactionbar-returns-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!