我有一个片段(片段1)被另一个片段(片段2)取代。片段1放置在堆栈上。我正在使用兼容模式(而不是ActionBarSherlock)。
这是我的问题。我希望操作栏在某些片段中显示为叠加,但在其他片段中则不显示。具体来说,当显示片段2时,我希望它显示在叠加层中,然后在片段2退出后返回到正常操作栏。
片段1有一个始终可见的常规操作栏。但是,当我用Fragment 2替换Fragment 1时,我需要在5秒后隐藏动作栏。如果有触摸事件,则会再次显示操作栏。这一切都很好,但是,每次隐藏或显示操作栏时,都会重新绘制片段2。因此,我想让片段2中的操作栏显示为叠加层。
我知道我可以更改操作栏覆盖,但我不知道如何从片段内以编程方式执行此操作。我不想为每个片段更改它,只是片段2。
思想?????
答案 0 :(得分:10)
这可能不是你所希望的答案。
考虑一个不同的问题:我们可以在调用setContentView(...)
后更改活动主题吗?这个问题已被多次询问,一个常见的解决方案是重新创建(调用finish()
和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");
}
....
....
}
因此,如果已经为Activity调用了setContentView(...)
(在你的情况下就是这样),将抛出运行时异常。
您是否有可能甚至不需要此功能?
首先将ActionBar设置为主题中的叠加层:
<item name="android:windowActionBarOverlay">true</item>
<!-- Support library attribute for compatibility -->
<item name="windowActionBarOverlay">true</item>
这是我的问题。我希望动作栏在某些片段中显示为叠加层......
好。我们已经为此做好了准备。
......但不在其他人身上。
假设您不想将ActionBar作为Fragment B中的叠加层。然后,在Fragment 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
android:layout_height="?android:attr/actionBarSize"
作为上面布局中的第一个子项放置。
本质上:
actionBarSize
。 一个注意事项(感谢Jelle
):
如果您的ActionBar
是半透明的,最好使用填充而不是边距来获得一致的外观。