将操作栏更改为从Fragment中叠加

Jus*_*ain 8 android android-fragments android-actionbar-compat

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

这是我的问题.我希望操作栏在某些片段中显示为叠加,但在其他片段中则不显示.具体来说,当显示片段2时,我希望它显示在叠加层中,然后在片段2退出后返回到正常操作栏.

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

我知道我可以更改动作栏覆盖,但我不知道如何从片段内以编程方式执行此操作.我不想为每个片段更改它,只是片段2.

思路?????

Vik*_*ram 11

这可能不是您希望的答案.

考虑一个不同的问题:我们可以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");
    }
    ....
    ....
}
Run Code Online (Sandbox Code Playgroud)

因此,如果setContentView(...)已经调用了Activity(在您的情况下),则会抛出运行时异常.

您是否有可能甚至不需要此功能?

首先将ActionBar设置为主题中的叠加层:

<item name="android:windowActionBarOverlay">true</item>
<!-- Support library attribute for compatibility -->
<item name="windowActionBarOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)

这是我的问题.我希望动作栏在某些片段中显示为叠加层...

好的.我们已经为此做好了准备.

......但不在其他人身上.

假设您不希望将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>
Run Code Online (Sandbox Code Playgroud)

将上边距设置为ActionBar的大小,片段B看起来好像有一个常规的ActionBar - 而不是一个重叠的ActionBar.实现这一目标的另一种方法是有一个Viewandroid:layout_height="?android:attr/actionBarSize"上述布局放置的第一个孩子.

在本质上:

  • 你的ActionBar将是一个叠加层.
  • 在ActionBar将自动隐藏的片段中,片段布局不会有任何上边距设置.
  • 在不应该覆盖ActionBar的片段中,片段布局设置为top-margin actionBarSize.

值得注意的一点(感谢Jelle):

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