如何使工具栏透明?

79

这是一个自我问答帖子 我有一个透明的ActionBar,它覆盖在布局上。在迁移到最新的支持库之后,我被迫放弃ActionBar,改用Toolbar。以前的使其透明并覆盖该布局的方法不再起作用。

<style name="CustomActionBarTheme" parent="@android:style/Theme.AppCompat">
    <item name="android:windowActionBarOverlay">true</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="android:actionBarStyle">@style/TransparentActionBar</item>
</style>

<style name="TransparentActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@android:color/transparent</item>
</style>
18个回答

50

使用背景为@null的AppBarLayout创建您的toolbar.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="@+id/general_appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@null"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="Login"
            android:textSize="20sp"/>
    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

这是结果:

在此输入图片描述


6
Android中android:background="@android:color/transparent"的意思是设置控件的背景为透明色。 - Hichem Acher
3
你不需要使用 AppBarLayout,只需为你的 android.support.v7.widget.Toolbar 设置 android:background="@null" - user25

42

您只需要定义一个隐藏操作栏的主题,用透明背景定义操作栏样式,并将此样式设置为工具栏小部件。请注意,工具栏应该是最后一个绘制的视图(在所有视图树之上)。

<style name="Theme.Custom" parent="@android:style/Theme.AppCompat">
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="android:windowActionBarOverlay">true</item>
</style>

<style name="CustomActionBar" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:windowActionBarOverlay">true</item>
    <!-- Support library compatibility -->
    <item name="windowActionBarOverlay">true</item>
</style>

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Toolbar should be above content-->
    <include layout="@layout/toolbar" />

</RelativeLayout>

工具栏布局:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:theme="@style/CustomActionBar"/>

2
如果你使用Toolbar,就把它当作一个普通的View。现在你可以随心所欲地做任何事情:设置工具栏背景透明、隐藏或显示它... 只是应用样式windowActionBarOverlay = true并不起作用。 - Huy Duong Tu
12
没有必要定义“Theme.Custom”,它没有任何用处。恐怕这不是一个真正可用的Q.A. - sancho21
1
虽然它确实有一些问题,但当父级是AppBarLayout时它无法正常工作。 - cammando
@HuyDuongTu,您能否请看一下这个问题:https://stackoverflow.com/questions/64192376/how-to-make-the-toolbar-faded-to-blend-in-with-the-layout-underneath# - Kumza Ion

41

通过查看 Google 的示例源代码,我发现如何使工具栏完全透明。它比我想象的要简单。我们只需创建一个简单的形状可绘制对象,如下所示。

该可绘制对象的名称为 toolbar_bg

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
    android:angle="90"
    android:startColor="@android:color/transparent"
    android:endColor="@android:color/transparent"
    android:type="linear" />
</shape>

然后在片段或活动中,像这样添加工具栏。

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/toolbar_bg"
        android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

这里我们将拥有一个完全透明的工具栏。

在此输入图片描述

如果您添加了 <android.support.design.widget.AppBarLayout >,那么这将无法正常工作。

注意: 如果您需要AppBarLayout,请将其高程设置为0,以便它不会绘制其阴影。


厉害了,你在AOSP中找到这个警告了吗? - KingKongCoder
2
如果两种颜色相同,使用渐变的原因是什么?为什么不直接将背景设置为透明? - Henry
@Henry 好问题。我尝试过使用纯透明色,但没有成功,不过你可以试一下,也许现在可以了。 - Pedro Varela
@Heny 你也可以试试这个。我的代码现在是这样的。在你的主题中设置..android:colorPrimary>@color/transparent和..name="colorPrimary">@color/transparent</item> - Pedro Varela
它将隐藏整个工具栏(Android 5.0模拟器),但至少它能够正常工作。 - CoolMind
显示剩余3条评论

22
工具栏就像一个视图,所以答案很简单。

工具栏就像一个视图,所以答案很简单。

toolbar.getBackground().setAlpha(0);

34
这种方式不太好,因为加载的可变位图是共享的。最好使用setBackgroundColor函数。 - selfsx
如何在XML中实现此功能? - IgorGanapolsky
1
android:alpha="0" - kiddouk
1
Alpha,对我隐藏“工具栏内容”。 - Basheer AL-MOMANI
1
它将隐藏工具栏视图组的所有视图。 - randy
显示剩余2条评论

18

只有这个对我有效(AndroidX支持库):

 <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@null"
            android:theme="@style/AppTheme.AppBarOverlay"
            android:translationZ="0.1dp"
            app:elevation="0dp">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@null"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </com.google.android.material.appbar.AppBarLayout>

这段代码可以移除所有必要视图的背景,并且还可以移除AppBarLayout的阴影(这是一个问题)

答案在此处找到:remove shadow below AppBarLayout widget android


不需要android:translationZ="0.1dp"! - user924

14
在style.xml中添加以下行:
<style name="Base.Theme.AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme" parent="Base.Theme.AppTheme">
</style>

现在在style-v21中添加以下行:

  <style name="AppTheme" parent="Base.Theme.AppTheme">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

并将主题设置为 android:theme="@style/AppTheme"

这将使状态栏透明。


10

只需在您的应用栏布局中像下面这样添加android:background="@android:color/transparent"

<android.support.design.widget.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="@android:color/transparent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>`

7
只需使用以下 xml 代码:
布局的代码:
<android.support.v7.widget.Toolbar
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/def_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/toolbarTransparent"
            android:layout_alignParentTop="true" />

colors.xml文件中添加以下代码:
<color name="toolbarTransparent">#00FFFFFF</color>

这将会给你想要的输出。

11
不,它不会使工具栏透明。 - IgorGanapolsky
@IgorGanapolsky:告诉我你都尝试了什么,我可以帮你解决问题。 - V_J
2
我有一个位于DrawerLayout内部的AppBarLayout和Toolbar,它们又都位于CoordinatorLayout内部。我尝试将AppBarLayout和Toolbar设置为透明背景,但是它们并没有变成透明的。 - IgorGanapolsky
3
它将工具栏颜色从透明改为了白色。 - Basheer AL-MOMANI

5
最简单的将工具栏设置为透明的方法是在@colors部分定义不透明度, 在@styles部分定义TransparentTheme,然后将这些定义放入您的工具栏中。

@colors.xml

<color name="actionbar_opacity">#33000000</color>

@styles.xml

<style name="TransparentToolbar" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:windowActionBarOverlay">true</item>
    <item name="windowActionBarOverlay">true</item>
</style>

@activity_main.xml

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:background="@color/actionbar_opacity"
        app:theme="@style/TransparentToolbar"
        android:layout_height="?attr/actionBarSize"/>

这是结果:

透明工具栏截图


漂亮而干净的回答方式。请保持这样 :) - Marco Hernaiz
1
那是灰色的,不是透明的。 - Himanshu Bansal

5

我通过创建两个 Theme.AppCompat.Light.NoActionBar 主题,并将 colorPrimary 属性设置为透明色,实现了半透明工具栏。

1)为不透明的工具栏创建一个主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    <!-- Toolbar background color -->
    <item name="colorPrimary">#ff212cff</item>

</style>

透明/覆盖工具栏的第二个主题:
<style name="AppTheme.Overlay" parent="AppTheme">
    <item name="colorPrimary">@color/transparent</item>
</style>

2) 在您的活动布局中,将工具栏放置在内容后面,以便可以在其前面显示:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/container"
        android:name="com.test.CustomFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

</RelativeLayout>

3) 在 AndroidManifest.xml 中将透明主题应用于您的活动

    <activity
        android:name="com.test.TransparentActivity"
        android:parentActivityName="com.test.HomeActivity"
        android:theme="@style/AppTheme.Overlay" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.test.HomeActivity" />
    </activity>

主要颜色必须是不透明的。 - Muhammad Alfaifi
谢谢!使用RelativeLayout代替CoordinatorLayout和将Toolbar放在视图后面特别有用。现在我甚至可以在状态栏后面画图了。 - CoolMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接