这可能不是您所希望的答案。
考虑一个不同的问题:我们可以在之后更改活动主题吗?setContentView(...)
已被调用?这个问题已经被问过很多次了,一个常见的解决方案是重新创建(调用finish()
and startActivity(getIntent())
) 活动并在之前设置新主题setContentView(...)
.
您的问题是对此的扩展 - 增加了从片段更改主题的复杂性。无论如何,我不认为上面提到的解决方案是好的。
ActionBar 是创建 Activity 时最先初始化的组件之一。我认为您不会找到一种方法来用新属性来“刷新”它。请参阅下面如何requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)
方法处理 post-setContentView(...) 调用:
@Override
public boolean requestFeature(int featureId) {
if (mContentParent != null) {
throw new AndroidRuntimeException("requestFeature() must be
called before adding content");
}
....
....
}
So, if setContentView(...)
已经为 Activity 调用了(在您的情况下),将抛出运行时异常。
有可能您甚至不需要此功能吗?
首先将 ActionBar 设置为主题中的覆盖层:
<item name="android:windowActionBarOverlay">true</item>
<!-- Support library attribute for compatibility -->
<item name="windowActionBarOverlay">true</item>
这是我的问题。我希望操作栏在某些片段中显示为叠加...
好的。我们已经在上面对此进行了规定。
...但其他人则不然。
假设您不希望 ActionBar 作为片段 B 中的叠加层。然后,在片段 B 的布局中,执行以下操作:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?android:attr/actionBarSize" > <<<-- ?attr/actionBarSize
for compatibility
....
....
</LinearLayout>
将上边距设置为 ActionBar 的大小后,片段 B 看起来就像有一个常规的 ActionBar - 而不是一个重叠的 ActionBar。实现这一目标的另一种方法是View
with android:layout_height="?android:attr/actionBarSize"
放置为上面布局中的第一个子项。
在本质上:
- 你的 ActionBar 将是一个覆盖层。
- 在 ActionBar 将自动隐藏的片段中,片段布局will not有任何上边距设置。
- 在 ActionBar 不应重叠的片段中,片段布局will将上边距设置为
actionBarSize
.
值得注意的一点(感谢Jelle
):
If your ActionBar
是半透明的,最好使用填充而不是边距以获得一致的外观。