getActionBar返回null

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

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

Device是运行Android 3.2的三星Galaxy Tab 10.1

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

Solutions Collecting From Web of "getActionBar返回null"

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

 @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 true // to your style definition. getWindow().requestFeature(Window.FEATURE_ACTION_BAR); setContentView(R.layout.main); // experiment with the ActionBar ActionBar actionBar = getActionBar(); actionBar.hide(); } 

代码来自[ here ]

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

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

 public class MagicActivity extends Activity 

确保您的应用清单有类似的内容

  

并确保您的活动布局

  

-标记

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

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

  // remove this line if you have this in your code  

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

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

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

这解决了我的问题:

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

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

  

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

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

对于Android Manifest:

  // remove this line if you have this in your 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 true // 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主题。 当您想要隐藏操作栏中的项目(如后退按钮)时,您需要执行以下操作:在您的活动中(不在片段类中)如果您将使用getActionBar(),它将返回null。 在Appsupport主题中,getSupportAcionBar()将返回操作栏。

如果您想关注DevByte,可以使用以下链接

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

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