Я обновляю свое приложение новой панелью инструментов из библиотеки поддержки 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);
android
android-5.0-lollipop
material-design
android-toolbar
Мистер Брайтсайд
источник
источник
Ответы:
В итоге я установил собственную тень для панели инструментов, и подумал, что это может пригодиться всем, кто ее ищет:
@ Вытяжка / toolbar_dropshadow:
@ Цвет / color_alizarin
источник
android:layout_height="4dp"
высоту тени, а не5dp
. Фактически, высота равна высоте тени, которую вы установилиFrameLayout
.Google выпустил библиотеку поддержки проектирования несколько недель назад, и в этой библиотеке есть отличное решение этой проблемы.
Добавьте библиотеку поддержки проектирования в качестве зависимости в
build.gradle
:Добавьте
AppBarLayout
предоставленный библиотекой обертку вокругToolbar
макета, чтобы создать тень.Вот результат:
Есть много других хитростей с библиотекой поддержки дизайна.
AndroidX
Как указано выше, но с зависимостью:
и
com.google.android.material.appbar.AppBarLayout
источник
AppBarLayout
качестве обертки вокругToolbar
не создает никакой тени для меня. Обратите внимание, что я не использую навигационный ящик. Есть идеи, почему это не работает?Вы не можете использовать атрибут повышения до API 21 (Android Lollipop). Однако вы можете добавить тень программно, например, используя пользовательский вид, расположенный под панелью инструментов.
@ Макет / панель
@ Вытяжка / toolbar_dropshadow
в макете вашей деятельности
<include layout="@layout/toolbar" />
источник
@layout/toolbar
пример с полным файлом макета?Используйте папки / values для применения правильного стиля тени в зависимости от версии ОС.
Для устройств до версии 5.0 используйте /values/styles.xml, чтобы добавить windowContentOverlay к основной части своей деятельности:
Затем добавьте свою собственную тень, изменив тему:
Вы можете получить теневой ресурс приложения ввода-вывода Google здесь: https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png
Для устройств 5.0 и более поздних версий используйте /values-v21/styles.xml, чтобы добавить высоту на панель инструментов, используя собственный стиль заголовка:
Обратите внимание , что во втором случае я должен был создать пустой MyViewArea стиль так windowContentOverlay не будет отображаться слишком.
[Обновление: изменены имена ресурсов и добавлена тень Google.]
источник
android:foreground
работает только на FrameLayout до API 23.Это сработало для меня очень хорошо:
источник
Если вы устанавливаете
ToolBar
как,ActionBar
тогда просто позвоните:Примечание: это должно быть вызвано после
setSupportActionBar(toolbar);
источник
setElevation()
определяется только для API-21 +.ViewCompat.setElevation()
и, следовательно, будет работать только на API 21 и выше.я добавил
в описании панели инструментов, и это работает для меня. Используя 5.0+
источник
Это нормальное поведение. Также смотрите FAQ в конце этого поста .
источник
Несколько часов играл с этим, вот что сработало для меня.
Удалить все
elevation
атрибуты изappBarLayout
иToolbar
виджетов ( в том числе ,styles.xml
если вы подаете любой стиль).Теперь внутри деятельности, примените
elvation
на вашactionBar
:Это должно работать.
источник
setElevation
принимает параметр в виде пикселей. Вы должны преобразовать его соответствующим образом, например,(int) (3.0 / Resources.getSystem().getDisplayMetrics().density)
Вы также можете заставить его работать
RelativeLayout
. Это немного уменьшает вложенность макета;)источник
Все, что вам нужно,
android:margin_bottom
равноandroid:elevation
значению. НетAppBarLayout
,clipToPadding
и т.д. требуется.Пример:
источник
Для 5.0+: вы можете использовать AppBarLayout с панелью инструментов. AppBarLayout имеет атрибут "возвышение".
источник
actionbar_background.xml
добавить к фону actionbar_style
имя = "displayOptions"> useLogo | showHome | ShowTitle | showCustom
добавить в Basetheme
источник
Большинство решений отлично работают здесь. Хотелось бы показать другую, похожую альтернативу:
Gradle:
Ваш макет может иметь вид панели инструментов, и тень для него ниже, похожая на эту (конечно, нужно изменить):
RES / вытяжка-V21 / toolbar_action_bar_shadow.xml
Рез / рисуем / toolbar_action_bar_shadow.xml
Рез / рисуем / msl__action_bar_shadow.xml
styles.xml
MainActivity.kt
Полный пример здесь , как я заметил, в 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"
Если вы используете другой цвет, то белый для фона, он удалит тень. Хороший Google!
источник