移除ActionBar下方的阴影。

219

我使用actionbarsherlock。下面的代码片段负责将其背景更改为自定义背景。

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.ActionBar">
    <item name="background">@drawable/actionbar_bg</item>
    <item name="android:background">@drawable/actionbar_bg</item>
    <...>  
</style>

<style name="Theme.MyApp" parent="@style/Theme.Sherlock.Light">
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <..>
</style>

它适用于ActionBarSherlock(在Honeycomb版本以下)。但是,在ICS中,我的操作栏下方有一个阴影,我不想要。 有什么样式项可以使它消失?

14个回答

496

如何让一个样式项消失?

为了去除阴影,将以下内容添加到你的应用主题中:

<style name="MyAppTheme" parent="android:Theme.Holo.Light">
    <item name="android:windowContentOverlay">@null</item>
</style>

更新: 正如@Quinny898所述,在Android 5.0上,你必须在操作栏中调用setElevation(0)。请注意,如果使用支持库,则必须像这样调用它:

getSupportActionBar().setElevation(0);

97
谢谢,它已经消失了。需要注意的重要事项是,这行代码应该出现在应用程序主题中,而不是操作栏样式中。 - Michał Klimczak
3
我工作了!需要明确的是,这行代码应该添加在App主题标签中,而不是ActionBar主题标签中。 - tuoxie007
在Lollipop之前,是否可能只使用代码而不是XML来完成它? - android developer
6
对于 Lollipop 以下的设备,使用 getSupportActionBar().setElevation(0); 是无效的。因此,你需要在应用程序主题中添加 <item name="android:windowContentOverlay">@null</item> 来解决这个问题。我之前也遇到过类似的问题,现在我的解决方法是同时使用了 setElevation 和在应用程序主题中添加 windowContentOverlay。其中,setElevation 适用于 Android 5.0 和以上版本,而另一个方法则适用于 Lollipop 以下的版本。祝好运! - Reaz Murshed
1
需要注意的是,在使用getSupportActionBar().setElevation(0);时,你必须在调用setContentView()之前调用此方法才能生效。 - levibostian
显示剩余3条评论

147

如果你想将Android 5.0直接设置为一个样式,请使用以下代码:

<item name="android:elevation">0dp</item>

要实现支持库的兼容性,请使用:

<item name="elevation">0dp</item>

AppCompat浅色主题的样式示例:

<style name="Theme.MyApp.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <!-- remove shadow below action bar -->
    <!-- <item name="android:elevation">0dp</item> -->
    <!-- Support library compatibility -->
    <item name="elevation">0dp</item>
</style>

然后将这个自定义的ActionBar样式应用到你的应用主题中:

<style name="Theme.MyApp" parent="Theme.AppCompat.Light">
    <item name="actionBarStyle">@style/Theme.MyApp.ActionBar</item>
</style>

对于 Android 5.0 之前的版本,请将以下内容添加到您的应用主题中:

<!-- Remove shadow below action bar Android < 5.0 -->
<item name="android:windowContentOverlay">@null</item>

1
对于5.0以下的设备,这对我没有用。问题是,我将windowContentOverlay添加到了操作栏主题而不是应用程序主题。 - Oliv
1
很抱歉,但我正在尝试做相反的事情,让高程阴影实际上出现在早期的设备上(我已经使用android:elevation成功地在Lollipop设备上完成了这个任务)。但是,我无法使用这种方法来实现它。我相信这应该是相当简单的。只需为高程属性设置一个非零值即可。 - acrespo
如果您没有触碰android:windowContentOverlay属性,它应该默认可见,也许您需要检查是否使用了正确的主题...我认为您需要使用AppCompat主题。 - Sloosh
@Sloosh,我们能通过编程实现这个吗? - Saeed Jassani
2
这个方法可行,但只有在parent属性中使用<style name="Theme.MyApp.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">而不是带有style/的情况下才有效。 - Igor
显示剩余3条评论

104

在 Android 5.0 上,这个已经改变了,您需要在操作栏上调用 setElevation(0)。请注意,如果您正在使用支持库,您必须像这样调用它:

在 Android 5.0 上,你需要在你的动作栏上调用 setElevation(0)。请注意,如果你使用支持库,你必须这样调用:

getSupportActionBar().setElevation(0);

它不受windowContentOverlay风格项的影响,因此无需更改样式。


1
你需要为每个活动都这样做吗?还是有一种快速的方法可以应用于所有活动?我现在会将其添加到所有活动中。谢谢! - cnfw
就像其他任何操作栏方法一样(例如标题),我认为每个活动都应该这样做。 - Kieron
和@splinter123一样:(不知道如何在使用AppCompat时删除早期Lollipop上的阴影。 - FD_
请看一下我上面的解决方案,它解释了如何在Lollipop之前和使用AppCompat的情况下进行操作。 - Sloosh
这个程序可以正常工作,但是我在 ActionBar 上有一个返回箭头,它无法接收任何输入。有什么解决办法吗? - techtinkerer
显示剩余3条评论

56

在AppBarLayout中添加app:elevation="0dp"以隐藏应用栏中的阴影。


1
大家看这里,只需要应用这个解决方案,忘记其他人说的话。谢谢啊!它有效了!非常简单的解决方案! - S bruce
1
请按照以下方式使用: <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:elevation="0dp" android:theme="@style/AppTheme.AppBarOverlay"> - Bharat Kul Ratan
@MarcoFerrari 如果“getSupportActionBar().setElevation(0);”无效,请在AppBarLayout中使用此代码。 - Salil Dhawan

39

如果您正在使用ActionBarSherlock

请在您的主题中添加以下内容:

<style name="MyTheme" parent="Theme.Sherlock">
    ....
    <item name="windowContentOverlay">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    ....
</style>

这是一个更好的答案,它指定了兼容性条目。 - 1owk3y

30

你必须在 android.support.design.widget.AppBarLayout 中设置 app:elevation="0dp",然后它就会起作用。

<android.support.design.widget.AppBarLayout
    app:elevation="0dp"... >

    <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.support.v7.widget.Toolbar>

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

1
这会导致AppBar的阴影在任何地方都消失 - 我如何通过编程来控制它? - Suisse

19
app:elevation="0dp" 

但是不

android:elevation="0dp"

这对我的Android L系统有效。


3

我也曾遇到这个问题,不过我已经成功解决了。你只需要在想要去掉阴影的活动中将海拔高度改为0即可。

如果你想在名为MyActivity.java的活动中进行更改,那么你首先需要获取ActionBar

首先导入ActionBar类。

import android.support.v7.app.ActionBar;

在导入后,您需要初始化一个操作栏变量并将其高程设置为0。
 private ActionBar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    .
    .
    toolbar=getSupportActionBar();
    toolbar.setElevation(0);
    .
    .
    }

2

Kotlin解决方案(Android 3.3,Kotlin 1.3.20)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.elevation = 0f
}

不确定为什么这个被踩了(我是 Kotlin 新手),但这对我有效,而其他方法则无效。 - Allen Wixted

1
在OnCreate方法中添加toolbar.getBackground().setAlpha(0)。然后在工具栏的xml文件中添加android:elevation="0dp" android:background="@android:color/transparent

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