サポートライブラリv21の新しいツールバーでアプリをアップデートしています。私の問題は、「elevation」属性を設定していないと、ツールバーが影を落とさないことです。それは通常の動作ですか、それとも私は何か問題がありますか。
私のコードは:
<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);
ツールバーにドロップシャドウを設定することになりました。
<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>
@ drawable/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/color_alizarin
<color name="color_alizarin">#e74c3c</color>
Googleは数週間前にデザインサポートライブラリをリリースしましたが、このライブラリにはこの問題に対する優れた解決策があります。
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>
これが結果です。
デザインサポートライブラリには他にもたくさんのトリックがあります。
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" />
@ drawable/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" />
OSのバージョンに基づいて正しいシャドウスタイルを適用するには、/ 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アプリシャドウリソースはこちらから入手できます。 https://github.com/google/iosched/blob/master/Android/src/main/res/drawable-xxxhdpi/bottom_shadow。 9.png
5.0以降のデバイスでは、/ 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>
2番目のケースでは、windowContentOverlayも表示されないように、空のMyViewAreaスタイルを作成する必要がありました。
[更新:リソース名を変更し、Google shadowを追加した。]
これは私にとってとてもうまくいった:
<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>
ToolBar
をActionBar
として設定している場合は、以下を呼び出してください。
getSupportActionBar().setElevation(YOUR_ELEVATION);
注:これはsetSupportActionBar(toolbar);
の後に呼び出さなければなりません
私の問題は、「elevation」属性を設定していないと、ツールバーが影を落とさないことです。それは通常の動作ですか、それとも私は何か問題がありますか。
それが通常の動作です。 この記事 の最後のFAQも見てください。
何時間もこれでいじっていた、これは私のために働いたものです。
elevation
ウィジェットとappBarLayout
ウィジェットから(すべてのスタイルを適用する場合はstyles.xml
を含む)、すべてのToolbar
属性を削除します。
アクティビティ内で、elvation
にactionBar
を適用します。
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setElevation(3.0f);
これでうまくいくはずです。
追加した
<Android.support.v7.widget.Toolbar
...
Android:translationZ="5dp"/>
ツールバーの説明でそれは私のために働く。 5.0+を使う
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>
必要なのは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>
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>
name = "displayOptions"> 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>
ほとんどの解決策はここでうまくいきます。別の似たような方法を見せたいです。
グラドル:
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)
}
}
フルサンプル ここ 、IDEにはforeground
属性がここでは使用するには新しすぎると言うバグがあります。
私は影についても同様の問題を抱えていました。私の場合、影はAppBarLayoutの直接の親によって描画されます。親の高さがAppBarLayoutの高さと同じ場合、影は描画できません。そのため、親レイアウトのサイズをチェックし、レイアウトを変更することで問題を解決できます。 https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/
正しい答えは追加することになります
Android:backgroundTint = "#ff00ff"ツールバーにAndroid:background = "@ Android:color/white"
背景に白以外の色を使用すると、影が消えます。グーグル1グーグル!
5.0以降の場合:AppBarLayoutをツールバーと一緒に使用できます。 AppBarLayoutには「標高」属性があります。
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appbar"
Android:layout_width="match_parent"
Android:elevation="4dp"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<include layout="@layout/toolbar" />
</Android.support.design.widget.AppBarLayout>