我遇到了同样的问题,在我看来,找到了这种奇怪行为的原因。我查看了支持库的来源并得到了这个:
Appcompat在ActionBarActivityDelegatemHasActionBar
中创建新的操作栏之前检查变量的值
final ActionBar getSupportActionBar() {
// The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar
// could change after onCreate
if (mHasActionBar || mOverlayActionBar) {
if (mActionBar == null) {
mActionBar = createSupportActionBar();
...
我们可以通过调用supportRequestWindowFeature(int featureId)
委托ActionBarActivity
给ActionBarActivityDelegate来更改它的值。
有基础委托类ActionBarDelegateBase
及其后代ActionBarDelegateHC
,,,,根据运行的android版本选择其中一个ActionBarActivityDelegateICS
。ActionBarActivityJB
并且方法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);
}
}
像这样调用您requestFeature()
的onCreate
活动方法
if (Build.VERSION.SDK_INT >= 11) {
requestFeature();
}
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
我使用了第二种方式。就这样。