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