如何使工具栏透明?


72

这是自我问答环节, 我有透明的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>

Answers:


48

使用AppBarLayout的背景创建@ tools.xml文件@null

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

这是结果:

在此处输入图片说明


3
android:background="@android:color/transparent"
Hichem Acher

2
您不需要的AppBarLayout,只android:background="@null"为您的android.support.v7.widget.Toolbar
user25 2013年

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
如果您使用工具栏,只需将其视为普通视图即可。现在,您可以执行任何操作:将工具栏背景设置为透明,隐藏或显示...仅应用样式windowActionBarOverlay = true不起作用。
2014年

11
没有一点定义“ Theme.Custom”。什么也没用。恐怕这不是真正有效的质量检查
sancho21,2014年

1
虽然可以,但是存在一些问题,因为当父级为AppBarLayout时它不起作用
cammando 17/02/28

@HuyDuongTu请你看一下这个问题:stackoverflow.com/questions/64192376/...
Kumza离子

38

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

可绘制的名称是 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
如果两种颜色相同,为什么要使用渐变呢?为什么不简单地将背景设置为透明?
亨利

@亨利很好的问题。我尝试过使用透明的固体,但是没有用,但是您可以尝试一下,也许现在可以用了。
Pedro Varela

@Heny也尝试这个。我现在有这样的代码。设置您的主题..android:colorPrimary> @ color / transparent和..name =“ colorPrimary”> @ color / transparent </ item>
Pedro Varela

它会隐藏整个工具栏(Android 5.0的仿真器),但至少可以工作。
CoolMind

22

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

toolbar.getBackground().setAlpha(0);

34
这不是很好的方法,因为共享了已加载的可变位图。最好使用setBackgroundColor
selfsx 2014年

是的,他也可以使用您的方式。几乎一样。
Marco Vignoli 2014年

1
android:alpha="0"
kiddouk 2015年

1
alpha,toolbar content为我隐藏
Basheer AL-MOMANI 2016年

1
它将隐藏工具栏视图组的所有视图。
兰迪

13

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

9

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

在这里找到答案:https : //code-examples.net/en/q/1ea52cc


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 2015年

2
我在CoordinatorLayout(全部在DrawerLayout内部)内的AppBarLayout内部具有工具栏。我试图将透明背景应用于AppBarLayout和Toolbar,但是它不会变得透明。
IgorGanapolsky

2
white不会使工具栏颜色变色transparent
Basheer AL-MOMANI

5

也许您需要使用AppCompat-v7看一下这篇透明的操作栏21

该帖子建议的要点是

  1. 只需确保使用RelativeLayout放置工具栏和主体即可。
  2. 将工具栏放在最后。
  3. 为工具栏的android:background属性放置透明颜色

这应该可以轻松解决问题。


有工具栏时为什么要使用操作栏?
IgorGanapolsky

推荐的帖子属于最初对ActionBar有问题的其他人:)
sancho21

5

把工具栏透明的最简单方法是定义一个不透明@colors部分,定义在TransparentTheme @styles部分,然后把这些定义你的工具栏中即可。

@ 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 HC

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而不是在视图后面CoordinatorLayoutToolbar后面特别有用。现在,我什至可以在StatusBar后面绘制图片。
CoolMind

2

我知道聚会晚了。我创建了一个简单的类来管理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;
}

2

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


2

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>

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

toolbar.background.alpha = 0

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

在我的案例风格AppBarLayout,并Toolbar没有发挥作用。


1

尝试下面的代码

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

style.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>

1

用于支持工具栏v7 android.support.v7.widget.Toolbar

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

xmlandroid: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>

如果标题不可见,请设置 textColor


如何使AppBarLayout背景完全透明......我同时滚动所有滚动AppBarLayout底部的观点应该是可见的...因为它是在Gmail应用stackoverflow.com/questions/54956542/...
Kavin拉朱小号

1

将以下代码添加到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"


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.