将操作栏更改为从片段内重叠

我有一个片段(片段1)被replace为另一个片段(片段2)。 片段1被放置在堆栈上。 我正在使用兼容模式(而不是ActionBarSherlock)。

这是我的问题。 我希望操作栏在某些片段中显示为叠加,而不是其他部分。 具体来说,当显示Fragment 2时,我希望它出现在叠加层中,然后在Fragment 2退出时再回到正常的操作栏。

片段1有一个常规的操作栏,始终可见。 但是,当我用Fragment 2replaceFragment 1时,我需要在5秒后隐藏操作栏。 如果有触摸事件,则再次显示操作栏。 这一切工作正常,但是,每当操作栏被隐藏或显示时,片段2都会重新绘制。 因此,我想让Fragment 2中的操作栏显示为叠加层。

我知道我可以改变操作栏覆盖,但我不知道如何从片段内以编程方式做到这一点。 我不想改变它的每一个片段,只是片段2。

思路?????

Solutions Collecting From Web of "将操作栏更改为从片段内重叠"

这可能不是你所希望的答案。

考虑一个不同的问题:在setContentView(...)被调用后,我们可以更改活动主题吗? 这个问题已经被多次提出了,一个常见的解决scheme是重新创build(调用finish()startActivity(getIntent()) )活动,并在setContentView(...)之前设置新的主题。

您的问题是对此的扩展 – 增加了从片段更改主题的复杂性。 无论如何,我不认为上述的解决scheme是好的。

ActionBar是创buildActivity时要初始化的第一个组件之一。 我不认为你会find一种方式来以新的属性“刷新”它。 请参阅下面的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"); } .... .... } 

所以,如果setContentView(...)已经被调用了Activity(就你的情况而言),将会抛出一个运行时exception。

有没有可能你甚至不需要这个function?

首先将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的大小,Fragment B看起来好像有一个常规的ActionBar – 不是重叠的。 另一种实现这个目的的方法是将android:layout_height="?android:attr/actionBarSize"作为第一个孩子放置在上面的布局中。

在本质上:

  • 你的ActionBar将是一个覆盖。
  • 在ActionBar自动隐藏的片段中,片段布局不会有任何上边距集合。
  • 在ActionBar不应该被覆盖的片段中,片段布局具有设置为actionBarSize的上边距。

一个值得注意的地方(感谢Jelle

如果您的ActionBar是半透明的,最好使用填充而不是边距来保持一致的外观。