Как убрать тень над панелью приложений?

Я хотел бы сделать строку состояния прозрачной, добавив <item name="android:statusBarColor">@android:color/transparent</item> в v21/styles.xml на style name="AppTheme.NoActionBar", но я продолжаю получать тень над панелью приложения, можно ли ее удалить?

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что решение состоит в том, чтобы переместить панель приложения, занимающую пространство строки состояния, и расширить панель приложения дополнительного dp, чтобы она соответствовала его размеру, поэтому мой вопрос: возможно ли переместить или увеличить высоту панели приложения вверх?

activity_search.xml

<android.support.design.widget.AppBarLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:theme="@style/MyMaterialTheme.AppBarOverlay">

     <android.support.v7.widget.Toolbar
          android:id="@+id/toolbar"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="?attr/colorPrimary"
          app:popupTheme="@style/MyMaterialTheme.PopupOverlay"/>

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

<include layout="@layout/content_search"/>

введите описание изображения здесь


person brettbrdls    schedule 29.02.2016    source источник
comment
выше или ниже? если выше, то это ваш цветPrimaryDark   -  person Bhargav    schedule 29.02.2016
comment
@Bhargav над панелью приложения, которая отображается в строке состояния.   -  person brettbrdls    schedule 29.02.2016
comment
Да, это ваш атрибут colorPrimaryDark, но если вы нарисуете под ним навигационный ящик, строка состояния должна быть прозрачной.   -  person Bhargav    schedule 29.02.2016
comment
@Bhargav да, причина, по которой я хотел добавить ‹item name=android:statusBarColor›@android:color/transparent‹/item›, заключается в том, что дальше я реализую панель навигации.   -  person brettbrdls    schedule 29.02.2016
comment
да, когда навигационный ящик окажется под ним, вы заметите, что строка состояния по-прежнему прозрачна, так что не беспокойтесь об этом и просто продолжайте кодировать   -  person Bhargav    schedule 29.02.2016
comment
@Bhargav, но мне кажется, что тень над панелью приложений визуально неверна :/   -  person brettbrdls    schedule 29.02.2016
comment
Я думаю, что тень - это тень не панели приложения, а строки состояния, даже если бы вы сделали высоту 0dp для панели приложения, все равно была бы эта тень, я думаю   -  person Bhargav    schedule 29.02.2016
comment
@Bhargav Я считаю, что это тень панели приложения, и я только что попытался сделать ее высоту = 0dp, вся ее тень исчезла, но я думаю, можно ли удалить только верхнюю часть ее тени, а не нижнюю один   -  person brettbrdls    schedule 29.02.2016
comment
почтовый код этого макета здесь, пожалуйста   -  person Bhargav    schedule 29.02.2016
comment
Вы пытались удалить app:popupTheme=@style/MyMaterialTheme.PopupOverlay? Возможно проблема в стиле.   -  person JJ86    schedule 09.03.2016
comment
@ JJ86 Нет, я считаю, что это не из-за стиля, так как это происходит каждый раз, когда я запускаю новый проект по умолчанию в Android Studio.   -  person brettbrdls    schedule 09.03.2016
comment
@brettbrdls, если вы так говорите; Можете ли вы показать нам свою тему MyMaterialTheme в формате xml?   -  person JJ86    schedule 09.03.2016
comment
Тень исходит из AppBarLayout , в частности, из атрибута app:elevation. Его можно установить на 0, но это, очевидно, также удалит нижнюю тень.   -  person natario    schedule 10.03.2016
comment
@mvai да, это проблема.   -  person brettbrdls    schedule 14.03.2016


Ответы (4)


Я полагаю, что этот вопрос указывает на ту же проблему высота панели приложений Android отображается в строке состояния

Возможные решения:

Ваш корневой макет всегда должен иметь android:fitsSystemWindows="true", иначе ваш пользовательский интерфейс не будет отображаться за строкой состояния.

Теперь оберните AppBarLayout внутри другого CoordinatorLayout, у которого есть

android:fitsSystemWindows="false".

Это предотвратит перетекание тени в строку состояния.

person Karol Żygłowicz    schedule 09.03.2016
comment
@brettbrdls, я не думаю, что это решение сейчас работает в AppCompat v24.0.0 - person Vipul Asri; 20.06.2016
comment
Что, если мой корневой макет — CoordinatorLayout? Я попытался обернуть его в другой макет, но в этом случае строка состояния белая, а должна быть красной (colorPrimaryDark). - person Chapz; 20.09.2016
comment
Неважно, какой у вас корневой макет. Оберните AppBarLayout в CoordinatorLayout и установите android:fitsSystemWindows=false. CoordinatorLayout предназначен для специального взаимодействия с элементами appcompat, поэтому он автоматически заботится о многих вещах. - person anandbibek; 23.09.2016
comment
Проблема в том, что обертывание вашего AppBarLayout в другой CoordinatorLayout нарушает ScrollingViewBehavior, поэтому RecyclerView теперь покрывает панель приложения и все остальное. В моем конкретном случае я пытаюсь заставить recyclerview скрываться за полупрозрачной панелью навигации, чтобы строка состояния не выглядела как дерьмо, без строки состояния, выходящей за верхнюю часть панели навигации и т. д. До сих пор все, что я пробовал ломает хотя бы один из них. - person Jim Pekarek; 24.03.2017

Добавьте отметку 0dp в AppBarLayout.

<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
person Malek Hijazi    schedule 29.02.2016
comment
Но можно ли удалить только тень над панелью приложений, а не нижнюю часть? - person brettbrdls; 29.02.2016

Вызовите метод ниже в onCreate вашей активности с желаемым цветом строки состояния.

public void changeStatusBarColor(String hexColor)
  {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor("#AD2525"));
    }
 }

XML

<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.example.bharath.myapplication.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

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

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#AD2525"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <!--
    Other views
    -->

</RelativeLayout></android.support.design.widget.CoordinatorLayout>

Результат

person Bharath Kumar    schedule 15.03.2016
comment
Единственный ответ, который работает. Другое предложение app:elevation=0dp побеждает объект. Спасибо - person Tony; 21.02.2017

Вы также можете добавить отступы на панели приложений в зависимости от высоты строки состояния:

ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
        val statusBarInsets = insets.getInsets(WindowInsetsCompat.Type.statusBars())
        val bottomBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
        binding.appBarLayout.setPadding(0, statusBarInsets.top, 0, 0)
        binding.root.setPadding(0, 0, 0, bottomBarInsets.bottom)
        insets
    }

Вы можете поместить это в свои методы onCreateView() или onViewCreated(). Не забудьте удалить android:fitsSystemWindows="true" из вашего макета, потому что вы вручную устанавливаете отступы для представлений, а вставки должны оставаться как полноэкранный фрагмент.

person rpinferetti    schedule 04.08.2021