getActionBar返回null

调用getActionBar返回null 。 这已经经常被报道,所以我已经确定包括其他人使用的解决scheme:我的minSdkVersion=11 ,我有一个标题栏,并且在setContentView之后调用getActionBar 。 另外,我的活动不是儿童活动。

 setContentView(R.layout.main); // experiment with the ActionBar ActionBar actionBar = getActionBar(); actionBar.hide(); 

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

提前感谢您的任何想法或build议!

看来你需要通过主题或通过下面的代码请求有一个操作栏(!=标题栏)。

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

来自[ 这里 ]的代码

看来有几个条件需要满足,才能这个工作。 那个长期困扰我的人是这样的:

确保您的活动扩展了Activity(而不是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" > 

-标记

我似乎通过getSupportActionBar()切换getActionBar()来解决所有的错误。 我曾尝试不同的主题,添加getWindow()。requestFeature(Window.FEATURE_ACTION_BAR); ,确保setContentView(视图)是第一个和所有其他事情之前看到的。

操作栏需要应用程序标题的主题或活动在那里。 确保您没有将您的应用程序或活动设置为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" > 

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

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

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

这解决了我的问题:

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

如果您为API14或更高版本创build应用程序项目,将会有一个值为14的文件夹。 确保该文件夹存在,并有一个styles.xml文件:

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

我得到这个错误,因为我创build了一个新的项目,我不想在我的项目中的任何额外的值文件夹,所以我只是保留值文件夹,并删除值-V11和值-V14文件夹。 但是,显然API14及其以上版本的默认主题需要在其父XML标签中包含一个ActionBar,如果您想使用ActionBar。 所以我认为我可以做到这一点不正确! 希望这有助于某人。 尽pipe如此,你最有可能解决你的问题。

真正的答案应该是@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(); } 

确保您扩展ACTIONBARACTIVITY而不是ACTIVITY这应该解决您的问题

只是改变两个东西1)清单文件编辑android:theme =“@ android:style / Theme.Holo”>

2)片段文件添加android:theme =“@ android:style / Theme.WithActionBar”

更改系统请求的顺序:

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

如果你正在开发一个以sdk> = 14为目标的应用程序,并且你正在扩展AppCompat来支持以前版本中的Material主题。 当你想隐藏你的操作栏中的项目,像后退button,你需要这样做:在你的活动(而不是在片段类)如果你会使用getActionBar()它将返回null。 如在Appsupport主题中,getSupportAcionBar()将返回操作栏。

这里是链接,如果你想跟随DevByte

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); getSupportActionBar().setDisplayHomeAsUpEnabled(false); } 

也许你的活动的风格是基于NoActionBar