我遇到了同样的问题,但是似乎找到了这种奇怪行为的原因。我查阅了支持库的源代码,并得到了以下信息:
在创建新的操作栏之前,Appcompat 检查 mHasActionBar
变量的值,具体请参见 ActionBarActivityDelegate
final ActionBar getSupportActionBar() {
if (mHasActionBar || mOverlayActionBar) {
if (mActionBar == null) {
mActionBar = createSupportActionBar();
...
我们可以通过调用supportRequestWindowFeature(int featureId)
来改变其值,该方法是由ActionBarActivity
委托给一个ActionBarActivityDelegate。
有基本委托类ActionBarDelegateBase
及其子类ActionBarDelegateHC
, ActionBarActivityDelegateICS
,ActionBarActivityJB
,其中一个根据正在运行的Android版本来选择。方法supportRequestWindowFeature
在几乎所有情况下都可以正常工作,但是在ActionBarActivityDelegateICS
中被覆盖,具体如下:
@Override
public boolean supportRequestWindowFeature(int featureId) {
return mActivity.requestWindowFeature(featureId);
}
因此,它对变量mHasActionBar没有影响,这就是为什么getSupportActionBar()返回null。
我们快要完成了。我想到了两种不同的解决方案。
第一种方法
从git导入appcompat的源项目。
将ActionBarActivityDelegateICS.java中的重写方法更改为类似以下内容:
@Override
public boolean supportRequestWindowFeature(int featureId) {
boolean result = mActivity.requestWindowFeature(featureId);
if (result) {
switch (featureId) {
case WindowCompat.FEATURE_ACTION_BAR:
mHasActionBar = true;
case WindowCompat.FEATURE_ACTION_BAR_OVERLAY:
mOverlayActionBar = true;
}
}
return result;
}
将此行代码放在活动的onCreate
方法中,在调用getSupportActionBar()
之前。
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR)
第二种方法
从Android SDK中导入appcompat项目(其中包含空的src目录)
将此方法添加到您的活动中
private void requestFeature() {
try {
Field fieldImpl = ActionBarActivity.class.getDeclaredField("mImpl");
fieldImpl.setAccessible(true);
Object impl = fieldImpl.get(this);
Class<?> cls = Class.forName("android.support.v7.app.ActionBarActivityDelegate");
Field fieldHasActionBar = cls.getDeclaredField("mHasActionBar");
fieldHasActionBar.setAccessible(true);
fieldHasActionBar.setBoolean(impl, true);
} catch (NoSuchFieldException e) {
Log.e(LOG_TAG, e.getLocalizedMessage(), e);
} catch (IllegalAccessException e) {
Log.e(LOG_TAG, e.getLocalizedMessage(), e);
} catch (IllegalArgumentException e) {
Log.e(LOG_TAG, e.getLocalizedMessage(), e);
} catch (ClassNotFoundException e) {
Log.e(LOG_TAG, e.getLocalizedMessage(), e);
}
}
在您的活动的onCreate
方法中调用requestFeature()
,如下所示
if (Build.VERSION.SDK_INT >= 11) {
requestFeature();
}
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
我使用了第二种方法。就这样。