Удалить тень под панелью действий

208

Я использую 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 (в версиях ниже сота). Но в ICS у меня есть тень под панелью действий, которая мне не нужна. Что это за стиль, чтобы он исчез?

Михал К
источник

Ответы:

481

Что это за стиль, чтобы он исчез?

Чтобы удалить тень, добавьте это в тему вашего приложения:

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

ОБНОВЛЕНИЕ: Как @ Quinny898 заявил, что в Android 5.0 это изменилось, вы должны вызвать setElevation(0)на панели действий. Обратите внимание, что если вы используете библиотеку поддержки, вы должны вызывать ее следующим образом:

getSupportActionBar().setElevation(0);
Томер Мор
источник
Разве это не стиль удаления тени из-под строки состояния, а не из-за панели действий?
Михал К
96
Спасибо, это исчезло. Важно отметить, что эта строка кода должна отображаться в теме приложения, а не в стиле панели действий.
Михал К
3
Я работаю! Необходимо четко понимать, что эту строку кода следует добавлять в тег темы приложения, а не в тег темы ActionBar.
tuoxie007
И еще одна вещь, которую также следует отметить, это то, что вы должны изменить свою тему в значениях, values-v11, value-v14 (если вы используете панель инструментов, игнорируйте это)
TheOne_su
6
для устройств перед леденцом getSupportActionBar().setElevation(0);не работает. Итак, вы вставили <item name="android:windowContentOverlay">@null</item>в свою тему приложения. У меня была похожая проблема. Теперь я их обоих. setElevation from и добавили элемент windowContentOverlay в тему приложения. setElevation работает для Android 5.0 и выше, в то время как другие работают для pre-lollipop. Ура!
Реаз Муршед
141

Для 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>
Sloosh
источник
1
Не работал для меня на pre 5.0 устройств. Проблема заключалась в том, что я добавил windowContentOverlayтему панели действий, а не тему приложения.
Олив
Извините, но я пытаюсь сделать противоположную вещь: заставить тень возвышения фактически появляться на устройствах перед леденцом на палочке (мне удалось сделать это android:elevationдля устройств Lollipop). Я не могу сделать это, используя этот подход. Я считаю, что это будет довольно прямо. Поставьте ненулевое значение для атрибутов высоты, и это будет так.
acrespo
Это должно быть видно по умолчанию, если вы не трогаете атрибут android: windowContentOverlay, возможно, убедитесь, что вы используете правильную тему ... Я думаю, вам нужно использовать тему AppCompat.
Слоош
но как бороться с android:windowContentOverlayпредварительно lollipop API? Я не могу скомпилировать, если мой minSDK предварительно lollipop, но цель 21?
Opiatefuchs
2
Это работало , но только тогда , когда я <style name="Theme.MyApp.ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">не style/в parentатрибуте.
Игорь
103

В Android 5.0 это изменилось, вы должны вызвать setElevation (0) на панели действий. Обратите внимание, что если вы используете библиотеку поддержки, вы должны вызывать ее следующим образом:

getSupportActionBar().setElevation(0);

На него не влияет элемент стиля windowContentOverlay, поэтому никаких изменений в стилях не требуется

Кирон
источник
1
Нужно ли делать это для каждого вида деятельности, или есть быстрый способ применить его ко всем действиям? Я добавлю это все мои действия на данный момент. Спасибо!
cnfw
Как и любой другой метод панели действий (например, заголовок), я бы сказал, что каждое действие
Kieron
Это позор. Было бы неплохо установить такие параметры в файле styles.xml. Может быть, это произойдет в будущем обновлении
cnfw
это не работает на более низких версиях, чем 5.0. Разве панель поддержки не должна быть совместима со всеми предыдущими устройствами?
splinter123
так же, как @ splinter123 здесь :( Интересно, как я могу удалить тени на предварительном
леденце
55

добавить app:elevation="0dp"в AppBarLayout для скрытия тени в панели приложений

Виджай Вавдия
источник
1
Посмотрите на всех, просто примените это решение и забудьте все, что говорили все остальные. Спасибо чувак! оно работает! Очень простое решение!
С Брюс
1
Используйте как это: <android.support.design.widget.AppBarLayout android: layout_width = "match_parent" android: layout_height = "wrap_content" app: elevation = "0dp" android: theme = "@ style / AppTheme.AppBarOverlay">
Бхарат Кул Ратан
@MarcoFerrari Используйте это в случае AppBarLayout как 'getSupportActionBar (). SetElevation (0);' не работает
Салил Дхаван
39

Если вы работаете с ActionBarSherlock

В вашей теме добавьте это:

<style name="MyTheme" parent="Theme.Sherlock">
    ....
    <item name="windowContentOverlay">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    ....
</style>
Дмитрий Зайцев
источник
это лучший ответ, в нем указывается пункт совместимости
1owk3y
25

Вы должны установить app:elevation="0dp"в, android.support.design.widget.AppBarLayoutи тогда это работает.

<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
это приводит к тому, что тень панели приложений отсутствует везде - как я могу управлять этим программно?
Suisse
14
app:elevation="0dp" 

но нет

android:elevation="0dp"

работал для меня на Android L

YTerle
источник
2

У меня такая же проблема, и я успешно решил эту проблему. Все, что вам нужно сделать, это просто изменить высоту на 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);
    .
    .
    }
шубхам гупта
источник
1

Для разработчиков Xamarin, пожалуйста, используйте: SupportActionBar.Elevation = 0;для AppCompatActivityили ActionBar.Elevation = 0;для некомпатных мероприятий

БИШИМО Audace
источник
1

Решение для Kotlin (Android 3.3, Kotlin 1.3.20)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.elevation = 0f
}
Zeeshan
источник
Не уверен, почему за это проголосовали (я новичок в Kotlin), но это сработало для меня там, где другие этого не сделали
Аллен Уикстед
1

Попробуйте это мне помогло без смены темы. Поместите свой AppBarLayout в любой макет. Надеюсь, это поможет вам

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="false"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:layout_height="?attr/actionBarSize"
       android:background="@color/white">
        <ImageView
            android:src="@drawable/go_grocery_logo"
            android:layout_width="108dp"
            android:layout_height="32dp" />
    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>
</RelativeLayout>
Рахул
источник
0

Для тех, кто работает с фрагментами, и он исчез после установки toolbar.getBackground().setAlpha(0);или любого исчезновения, я думаю, что вы должны довести свой AppBarLayout до последнего в xml, поэтому его Fragment затем AppBarLayout, а затем относительныйlayout / constraint / linear, который вы используете.

Боуи Чанг
источник
0

Добавьте это toolbar.getBackground().setAlpha(0);внутри метода OnCreate. Добавьте это: android:elevation="0dp" android:background="@android:color/transparent в ваш XML-файл панели инструментов.

Коллинз Уши
источник