如何使工具栏透明?

How to make Toolbar transparent?

提问人:Gleichmut 提问时间:10/22/2014 最后编辑:xarlymg89Gleichmut 更新时间:2/12/2021 访问量:155366

问:

这是自我问答帖子我有透明的ActionBar,可以覆盖布局。迁移到最新的支持库后,我被迫摆脱了 ActionBar,转而使用工具栏。使其透明并覆盖该布局的旧方法不再有效。

<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>
Material-Design Android工具栏

评论


答:

42赞 Gleichmut 10/22/2014 #1

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

<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赞 Huy Duong Tu 10/31/2014
如果您使用工具栏,只需将其视为普通视图。现在您可以执行任何您想做的事情:将工具栏背景设置为透明、隐藏或显示它...仅应用样式 windowActionBarOverlay = true 不起作用。
12赞 sancho21 12/30/2014
定义“Theme.Custom”毫无意义。什么都没有用。恐怕这不是一个真正的工作问答。
1赞 cammando 2/28/2017
虽然它确实如此,但它存在一些问题,因为当父级是 AppBarLayout 时它不起作用
0赞 Kumza Ion 10/5/2020
@HuyDuongTu请您看看这个问题:stackoverflow.com/questions/64192376/......
5赞 Ondřej Z 11/20/2014 #2

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

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>

评论

0赞 Muhammad Alfaifi 6/1/2016
原色必须不透明
0赞 CoolMind 12/19/2017
谢谢! 而不是视图和视图后面特别有用。现在,我甚至可以在 StatusBar 后面画一幅画。RelativeLayoutCoordinatorLayoutToolbar
22赞 Marco Vignoli 12/18/2014 #3

工具栏的工作方式类似于视图,因此答案非常简单。

toolbar.getBackground().setAlpha(0);

评论

34赞 selfsx 12/19/2014
这不是很好的方法,因为加载的可变位图是共享的。最好使用setBackgroundColor
0赞 Marco Vignoli 12/19/2014
是的,他也可以使用你的方式。这几乎是一样的。
1赞 kiddouk 9/7/2015
android:alpha="0"
1赞 Basheer AL-MOMANI 4/18/2016
阿尔法,为我隐藏toolbar content
1赞 randy 7/9/2016
它将隐藏工具栏视图组的所有视图。
5赞 sancho21 12/31/2014 #4

也许你需要看看这篇文章 带有 AppCompat-v7 21 的透明 Actionbar

该帖子建议的要点是

  1. 只需确保使用 RelativeLayout 来放置 Toolbar 和正文即可。
  2. 将工具栏放在最后。
  3. 为android:background属性添加透明颜色

这应该可以毫不费力地解决问题。

评论

0赞 IgorGanapolsky 9/1/2015
当我们有工具栏时,为什么要使用操作栏??
0赞 sancho21 9/1/2015
推荐的帖子属于最初遇到 ActionBar :) 问题的其他人
7赞 V_J 8/14/2015 #5

只需使用以下 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 9/1/2015
不,它不会使工具栏透明。
0赞 V_J 9/2/2015
@IgorGanapolsky:让我知道你试过什么。我可以尝试帮助您解决您的问题。
2赞 IgorGanapolsky 9/2/2015
我在 AppBarLayout 内部有一个 Toolbar,在 CoordinatorLayout 中(都在 DrawerLayout 中)。我尝试将透明背景应用于 AppBarLayout 和 Toolbar,但它没有变得透明。
3赞 Basheer AL-MOMANI 4/18/2016
它使工具栏颜色不whitetransparent
2赞 theapache64 11/9/2015 #6

我知道聚会迟到了。我创建了一个简单的类来管理透明度。Toolbar

import android.annotation.SuppressLint;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.widget.Toolbar;



public class TransparentToolbarManager {

    private Toolbar mToolbar;
    private ColorDrawable colorDrawable;
    public static final int MAX_ALPHA = 255, MIN_ALPHA = 0;

    public TransparentToolbarManager(Toolbar mToolbar) {
        this.mToolbar = mToolbar;
        this.colorDrawable = new ColorDrawable(mToolbar.getContext().getResources().getColor(R.color.colorPrimary));
    }

    public TransparentToolbarManager(Toolbar mToolbar, ColorDrawable colorDrawable) {
        this.mToolbar = mToolbar;
        this.colorDrawable = colorDrawable;
    }

    //Fading toolbar
    public void manageFadingToolbar(int scrollDistance) {
        if (mToolbar != null && colorDrawable != null) {
            //FadeinAndOut according to the horizontal scrollValue
            if (scrollDistance <= MAX_ALPHA && scrollDistance >= MIN_ALPHA) {
                setToolbarAlpha(scrollDistance);
            } else if (scrollDistance > MAX_ALPHA) {
                setToolbarAlpha(MAX_ALPHA);
            }
        }
    }


    @SuppressLint("NewApi")
    public void setToolbarAlpha(int i) {
        colorDrawable.setAlpha(i);
        if (CommonHelper.isSupport(16)) {
            mToolbar.setBackground(colorDrawable);
        } else {
            mToolbar.setBackgroundDrawable(colorDrawable);
        }
    }


}

和 CommonHelper.isSupport()

public static boolean isSupport(int apiLevel) {
        return Build.VERSION.SDK_INT >= apiLevel;
}
5赞 Jonoid 2/21/2016 #7

使 Toolbar 透明的最简单方法是在 @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"/>

结果如下:

屏幕截图透明工具栏

评论

0赞 Marco Hernaiz 4/1/2016
漂亮而干净的回答方式。保持这种方式:)
1赞 Himanshu Bansal 4/8/2021
那是灰色的,不透明的。
14赞 Reprator 8/11/2016 #8

在 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”

它将使状态栏透明。

41赞 Pedro Varela 8/26/2016 #9

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

drawable 的名称是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"/>

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

enter image description here

不要添加 如果你这样做,这将不起作用。<android.support.design.widget.AppBarLayout >

注意:如果需要 AppBarLayout,请将高度设置为 0,这样它就不会绘制其阴影。

评论

0赞 KingKongCoder 10/18/2017
太棒了,你在 AOSP 中发现了这个警告吗?
2赞 Henry 11/13/2017
如果两种颜色相同,使用渐变的原因是什么?为什么不简单地将背景设置为透明呢?
0赞 Pedro Varela 11/14/2017
@Henry好问题。我尝试过使用纯透明,但没有奏效,但您可以自由尝试一下,也许现在它可以工作了。
0赞 Pedro Varela 11/14/2017
@Heny也试试这个。我现在有这样的代码。根据您的主题设置..android:colorPrimary>@color/transparent 和 ..name=“colorPrimary”>@color/transparent</item>
0赞 CoolMind 12/19/2017
它将隐藏整个工具栏(Android 5.0 模拟器),但至少它可以工作。
1赞 Sỹ Phạm 10/15/2016 #10

尝试以下代码

<android.support.design.widget.AppBarLayout
                    android:id="@+id/app_bar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:theme="@style/AppTheme.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>

样式.xml

<style name="AppTheme.Transparent" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorPrimary">@android:color/transparent</item>
        <item name="colorControlActivated">@color/colorWhite</item>
        <item name="colorControlNormal">@color/colorWhite</item>
    </style>
50赞 Brian Vo 10/23/2016 #11

创建工具栏.xml@null AppBarLayout 背景的文件

<?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>

这是结果:

enter image description here

评论

6赞 Hichem Acher 4/22/2018
android:background="@android:color/transparent"
3赞 user25 4/29/2018
你不需要,只是为了你的AppBarLayoutandroid:background="@null"android.support.v7.widget.Toolbar
10赞 Rajesh.k 6/7/2017 #12

只需在应用栏布局中添加如下内容即可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>`
-6赞 Suraj Gaur 12/14/2017 #13

转到“包”并打开。 将“原色”设置为 。rescolor.xml#00000000

评论

2赞 Gregor Doroschenko 12/14/2017
请添加代码示例或更多解释,以使您的答案更清晰
1赞 user25 4/29/2018 #14

对于支持工具栏 v7android.support.v7.widget.Toolbar

法典

toolbar.setBackground(null);
// or
toolbar.setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));

xml ( 或android:background="@null"android:background="@android:color/transparent")

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="@null"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:ellipsize="start"
        android:singleLine="true"
        android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
</android.support.v7.widget.Toolbar>

如果 Title 不可见,则设置textColor

评论

0赞 Kavin Raju S 3/19/2020
如何使 AppBarLayout 背景完全透明...同时,我滚动所有视图,滚动 AppBarLayout 的底部应该是可见的......就像在Gmail App stackoverflow.com/questions/54956542/ 中一样......
2赞 Abubakar 9/8/2018 #15

只需在 AppBarLayout 标签中添加 android:background=“#10000000” 即可

2赞 CoolMind 1/25/2019 #16

https://stackoverflow.com/a/37672153/2914140 帮助了我。

我为一个活动做了这个布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/transparent" <- Add transparent color in AppBarLayout.
        android:theme="@style/AppTheme.AppBarOverlay"
        >

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

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

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        <- Remove app:layout_behavior=...
        />

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

如果这不起作用,请在活动中写入(其中工具栏是 @+id/toolbar):onCreate()

toolbar.background.alpha = 0

如果要设置半透明颜色(如 #30ff00ff),则设置 .甚至将背景颜色设置为 .toolbar.setBackgroundColor(color)AppBarLayout

就我而言,风格和没有发挥作用。AppBarLayoutToolbar

18赞 oxied 8/16/2019 #17

只有这对我有用(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 中的阴影(这是一个问题)

答案在这里找到:删除 AppBarLayout 小部件 android 下方的阴影

评论

0赞 user924 11/2/2021
android:translationZ=“0.1dp” 是不需要的!
1赞 somya 8/27/2019 #18

将以下代码添加到文件styles.xml

<style name="LayoutPageTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowActionBarOverlay">true</item>
    <!-- Support library compatibility -->
    <item name="windowActionBarOverlay">true</item>
    <item name="android:actionBarStyle">@style/TransparentActionBar</item>
</style>
<!-- ActionBar styles -->
<style name="TransparentActionBar"
    parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@android:color/transparent</item>
</style>

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

别忘了写:android:background="@android:color/transparent"