我使用支持库v21中的新工具栏更新了我的应用。我的问题是,如果我没有设置"提升"工具栏不会投射任何阴影。属性。这是正常行为还是我做错了什么?
我的代码是:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent">
.
.
.
在我的活动中 - OnCreate方法:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
答案 0 :(得分:239)
我最终为工具栏设置了自己的投影,认为它可能对寻找它的人有所帮助:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:orientation="vertical">
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_alizarin"
android:titleTextAppearance="@color/White"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- **** Place Your Content Here **** -->
<View android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@drawable/toolbar_dropshadow"/>
</FrameLayout>
</LinearLayout>
@绘制/ toolbar_dropshadow:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:startColor="@android:color/transparent"
android:endColor="#88333333"
android:angle="90"/>
</shape>
@颜色/ color_alizarin
<color name="color_alizarin">#e74c3c</color>
答案 1 :(得分:187)
在build.gradle
:
compile 'com.android.support:design:22.2.0'
将库提供的AppBarLayout
添加为Toolbar
布局的包装,以生成投影。
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
.../>
</android.support.design.widget.AppBarLayout>
结果如下:
设计支持库还有很多其他技巧。
答案 2 :(得分:22)
您不能在API 21(Android Lollipop)之前使用elevation属性。但是,您可以通过编程方式添加阴影,例如使用放置在工具栏下方的自定义视图。
@布局/工具条
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/blue"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<View
android:id="@+id/toolbar_shadow"
android:layout_width="match_parent"
android:layout_height="3dp"
android:background="@drawable/toolbar_dropshadow" />
@绘制/ toolbar_dropshadow
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="@android:color/transparent"
android:endColor="#88333333"
android:angle="90"/> </shape>
在您的活动布局中
<include layout="@layout/toolbar" />
答案 3 :(得分:17)
这对我很有用:
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primary"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="0dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primary"
android:minHeight="?attr/actionBarSize" />
</android.support.v7.widget.CardView>
答案 4 :(得分:17)
使用 / values 文件夹根据操作系统版本应用正确的阴影样式。
对于5.0以下设备,请使用 /values/styles.xml 将 windowContentOverlay 添加到您的活动正文中:
<style name="MyViewArea">
<item name="android:foreground">?android:windowContentOverlay</item>
</style>
<style name="MyToolbar">
<item name="android:background">?attr/colorPrimary</item>
</style>
然后通过更改主题来添加自己的自定义阴影:
<item name="android:windowContentOverlay">@drawable/bottom_shadow</item>
您可以在此处抓取Google的IO app影子资源:https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
适用于5.0设备&amp;稍后,使用 /values-v21/styles.xml 使用自定义标题样式将提升添加到工具栏:
<style name="MyViewArea">
</style>
<style name="MyToolbar">
<item name="android:background">?attr/colorPrimary</item>
<item name="android:elevation">4dp</item>
</style>
请注意,在第二种情况下,我必须创建一个空的 MyViewArea 样式,因此 windowContentOverlay 也不会显示。
[更新:更改了资源名称并添加了Google阴影。]
答案 5 :(得分:12)
如果您将ToolBar
设为ActionBar
,请致电:
getSupportActionBar().setElevation(YOUR_ELEVATION);
注意:必须在setSupportActionBar(toolbar);
答案 6 :(得分:7)
玩弄了几个小时,这对我有用。
如果您要应用任何样式,请从elevation
和appBarLayout
小部件中删除所有Toolbar
属性(包括styles.xml
。)
现在在内部活动中,在elvation
上应用actionBar
:
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setElevation(3.0f);
这应该有用。
答案 7 :(得分:7)
我的问题是,如果我没有设置&#34;提升&#34;工具栏不会投射任何阴影。属性。这是正常行为还是我做错了什么?
这是正常行为。另请参阅this post末尾的常见问题解答。
答案 8 :(得分:4)
您也可以使用RelativeLayout
。这样可以减少布局嵌套;)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar" />
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_below="@id/toolbar"
android:background="@drawable/toolbar_shadow" />
</RelativeLayout>
答案 9 :(得分:4)
我添加了
<android.support.v7.widget.Toolbar
...
android:translationZ="5dp"/>
工具栏说明中的,对我有用。 使用5.0 +
答案 10 :(得分:1)
在我的情况下,提升效果不佳,因为我没有为工具栏提供任何背景。尝试为工具栏提供背景颜色,然后设置高度,效果会很好。
答案 11 :(得分:1)
您需要的是一个android:margin_bottom
等于android:elevation
的值。不需要AppBarLayout
,clipToPadding
等。
示例:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_marginBottom="4dp"
android:background="@android:color/white"
android:elevation="4dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--Inner layout goes here-->
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.Toolbar>
答案 12 :(得分:1)
大多数解决方案在这里都可以正常工作。想展示另一个类似的选择:
等级:
implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
implementation 'com.google.android.material:material:1.0.0-rc02'
implementation 'androidx.core:core-ktx:1.0.0-rc02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
您的版式可以在下面有一个工具栏视图和一个阴影,类似于此(当然需要修改):
<LinearLayout
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:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:titleTextAppearance="@style/Base.TextAppearance.Widget.AppCompat.Toolbar.Title"/>
<include
layout="@layout/toolbar_action_bar_shadow"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
res / drawable-v21 / toolbar_action_bar_shadow.xml
<androidx.appcompat.widget.AppCompatImageView
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content" android:src="@drawable/msl__action_bar_shadow"/>
res / drawable / toolbar_action_bar_shadow.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:foreground="?android:windowContentOverlay" tools:ignore="UnusedAttribute"/>
res / drawable / msl__action_bar_shadow.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape
android:dither="true"
android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#00000000"
android:startColor="#33000000" />
<size android:height="10dp" />
</shape>
</item>
</layer-list>
styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar as Toolbar)
}
}
完整的示例here,正如我所注意到的那样,IDE的一个错误是说foreground
属性太新了,无法在此处使用。
答案 13 :(得分:1)
actionbar_background.xml
<item>
<shape>
<solid android:color="@color/black" />
<corners android:radius="2dp" />
<gradient
android:startColor="@color/black"
android:centerColor="@color/black"
android:endColor="@color/white"
android:angle="270" />
</shape>
</item>
<item android:bottom="3dp" >
<shape>
<solid android:color="#ffffff" />
<corners android:radius="1dp" />
</shape>
</item>
</layer-list>
添加到actionbar_style背景
<style name="Theme.ActionBar" parent="style/Widget.AppCompat.Light.ActionBar.Solid">
<item name="background">@drawable/actionbar_background</item>
<item name="android:elevation">0dp</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:layout_marginBottom">5dp</item>
名称= “displayOptions” &GT; useLogo | showHome | showTitle | showCustom
添加到Basetheme
<style name="BaseTheme" parent="Theme.AppCompat.Light">
<item name="android:homeAsUpIndicator">@drawable/home_back</item>
<item name="actionBarStyle">@style/Theme.ActionBar</item>
</style>
答案 14 :(得分:0)
我有阴影的类似问题。在我的情况下,阴影由AppBarLayout的直接父级绘制。如果父级的高度与AppBarLayout相同,则无法绘制阴影。因此,检查父布局的大小以及可能的布局重制可以解决问题。 https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
答案 15 :(得分:0)
对于5.0 +:您可以将AppBarLayout与工具栏一起使用。 AppBarLayout具有“提升”特征。
guestTeam.Opponents
答案 16 :(得分:0)
正确的答案是添加
android:backgroundTint =“#ff00ff”
到工具栏
与
android:background =“ @ android:color / white”
如果使用其他颜色,然后将白色用作背景,则它将消除阴影。 不错的一个Google!
答案 17 :(得分:0)
我发布此信息是因为这花了我几个小时才能找到,所以我希望它可以对某人有所帮助。
我有一个问题,尽管我创建了一个简单的活动并按如下所示放置了工具栏,但阴影/高程没有显示:
<androidx.appcompat.widget.Toolbar
android:id="@+id/mt_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
android:background="@color/colorPrimaryDark"
android:elevation="12dp"/>
事实证明,清单中
设置android:hardwareAccelerated="false"
引起了!一旦我将其删除,阴影就会出现