Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将actionbar从片段内更改为覆盖_Android_Android Fragments_Android Actionbar Compat - Fatal编程技术网

Android 将actionbar从片段内更改为覆盖

Android 将actionbar从片段内更改为覆盖,android,android-fragments,android-actionbar-compat,Android,Android Fragments,Android Actionbar Compat,我有一个片段(片段1),它被另一个片段(片段2)替换。片段1被放置在堆栈上。我使用的是兼容模式(不是ActionBarSherlock) 这是我的问题。我希望actionbar在某些片段中显示为覆盖,但在其他片段中不显示。具体来说,当显示片段2时,我希望它显示在覆盖中,然后在片段2退出后返回到正常的操作栏 片段1有一个始终可见的常规操作栏。但是,当我用片段2替换片段1时,我需要在5秒后隐藏操作栏。如果存在触摸事件,操作栏将再次显示。这一切都很好,但是,每次隐藏或显示动作栏时,片段2都会被重新绘制

我有一个片段(片段1),它被另一个片段(片段2)替换。片段1被放置在堆栈上。我使用的是兼容模式(不是ActionBarSherlock)

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

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

我知道我可以更改actionbar覆盖,但我不知道如何从片段中以编程方式进行更改。我不想对每个片段都进行更改,只想更改片段2


想法?

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

考虑另一个问题:调用
setContentView(…)
后,我们是否可以更改活动主题?这个问题已经被问了很多次,常见的解决方案是重新创建(调用
finish()
startActivity(getIntent())
)活动,并在
setContentView(…)
之前设置新主题

你的问题是对这一点的延伸——增加了从片段改变主题的复杂性。在任何情况下,我都不认为上面提到的解决方案是好的。 ActionBar是创建活动时首先要初始化的组件之一。我不认为你会找到一种方法,以某种方式“刷新”它与新的属性。请参见下面的
requestFeature(Window.FEATURE\u ACTION\u BAR\u OVERLAY)
方法如何处理post-setContentView(…)调用:

因此,如果已经为该活动调用了
setContentView(…)
(在您的情况下就是这样),将引发运行时异常

您甚至可能不需要此功能吗?

首先,将ActionBar设置为主题中的覆盖:

<item name="android:windowActionBarOverlay">true</item>
<!-- Support library attribute for compatibility -->
<item name="windowActionBarOverlay">true</item>
true
真的
这是我的问题。我希望actionbar在一些片段中显示为覆盖

好的。我们已经为上述内容准备好了

。。。但在其他方面则不然

假设您不想将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依赖于活动,而不是此解决方案可能无法使用默认actionbar您可能只需要创建自己的类似actionbar的布局,然后您就可以对其进行更多控制。如果您只是将动作栏用作标题,我建议您这样做,因为我知道动作栏依赖于活动。我使用actionbar不仅仅是为了标题栏。我想的是,是否有一种方法可以通过调用主活动来改变片段中的acionbar。问题是,我需要以编程方式这样做,因为通过主题应用更改(我认为)为时已晚?????如果我知道你想要的只是修改你片段中的动作栏,对吗?没错。我可以将项目添加到acionbar。我需要知道的是,如何将actionbar类型更改为overlay。是否切换其可见性?改变它的可见性是很容易的。但在运行时使其覆盖可能有点困难或棘手。我也使用这种方法。如果您的
LinearLayout
具有自定义背景,则最好使用
paddingTop
而不是
marginTop
@Jelle Ah yes。你说得对。如果actionbar是(半透明的),那么使用填充的想法将最有效。但是,如果actionbar有不透明的背景/颜色,那么边距会更好——不透支。我将编辑我的答案以包含此内容。谢谢。很高兴想到透支@只是再学一次不客气。谢谢你提出一个有趣的问题&赏金:)。
<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>