CollapsingToolBarLayout - цвет экрана строки состояния не меняется

Несколько дней назад я обновил свою студию Android и начал работать с CoordinatorLayout и CollapsingToolbarLayout, просто пробуя что-то.

Кажется, что цвет экрана панели инструментов переопределяет начальный цвет строки состояния и цвет экрана строки состояния (пробовал как из xml, так и из кода)

начальное состояние:

начальное состояние:


начал прокручивать:

начал прокручивать


прокручивается до коллапса:

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


Итак, вопросы:

  1. Как я могу запретить панели инструментов переопределять строку состояния при сворачивании (даже не позволяя изображению, которое я сворачиваю, подниматься над ним).

  2. Как я могу изменить цвет строки состояния после краха

Еще одна проблема, с которой я столкнулся, заключалась в том, что я задал панели инструментов исходный цвет, а не только цвет сетки, потому что я хотел, чтобы панель инструментов располагалась над изображением, но вместо этого она располагалась поверх изображения и закрывала часть его, а также закрывала все, что будет рухнуть за ним


добавлен цвет/стиль на панель инструментов в xml:

добавлен цвет/стиль на панель инструментов в xml


  1. Есть ли способ поставить панель инструментов над картинкой с самого начала и просто свернуть изображение? (думал о том, чтобы, возможно, сохранить панель инструментов закрепленной и макет кадра перед изображением, но он все равно рухнет в области строки состояния, что является основным вопросом.)

основной вид деятельности xml:

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

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:contentScrim = "?attr/colorPrimary"
        app:statusBarScrim="?attr/colorAccent" --------> not changing
        android:id="@+id/my_ctl">


        <ImageView
            android:id="@+id/image"
            android:src="@drawable/flights"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"
            />

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


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

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


<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" >

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

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_dialog_email" />

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

Основная активность.java:

  CollapsingToolbarLayout ctl = (CollapsingToolbarLayout) findViewById(R.id.my_ctl);
    //ctl.setContentScrimColor(Color.RED);
    ctl.setStatusBarScrimColor(Color.BLUE);  --------> not working
    ctl.setTitle("blabla");



Ответы (5)


Измените app:statusBarScrim="?attr/colorAccent" панели CollapsingToolbar на app:statusBarScrim="@android:color/transparent".

Затем вы можете установить цвет CollapsingToolbar на ctl.setStatusBarScrimColor(Color.BLUE); в своем коде.

Также убедитесь, что вы добавили android:fitsSystemWindows="true" в AppBarLayout.

person wklbeta    schedule 16.05.2016

Попробуйте добавить android:fitsSystemWindows="true" в AppBarLayout. Это сработало для меня.

person Vineet Ashtekar    schedule 25.02.2016

По пункту №3: на панели инструментов добавьте прозрачный фон

android:background="@android:color/transparent"

 <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:layout_collapseMode="pin"
            android:background="@android:color/transparent" />
person Allan Ramírez    schedule 28.02.2016

2) существует известная проблема.

пока я устанавливаю цвет фона панели инструментов программно

    mAppBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {
        @Override
        public void onStateChanged(AppBarLayout appBarLayout, State state) {
            Toolbar toolbar = (Toolbar) mAppBarLayout.findViewById(R.id.toolbar_top);
            int toolbarBackground = (state == AppBarStateChangeListener.State.COLLAPSED) ? R.color.color_collapsed : R.color.color_non_collapsed;
            toolbar.setBackgroundColor(ContextCompat.getColor(DealsOptionsActivity.this, toolbarBackground));
        }

    });

это, конечно, простая реализация. Вы можете оптимизировать его.

person kingston    schedule 20.10.2016
comment
AppBarStateChangeListener нет, поэтому, вероятно, OP должен сделать что-то вроде этого: stackoverflow.com/questions/31682310/ - person dumbfingers; 28.10.2016
comment
Вы не должны обновлять свои представления при использовании offsetlistener, это очень важно для пользовательского интерфейса, на очень слабых устройствах это вызовет отставание пользовательского интерфейса. Если вы проверите журналы, он всегда будет выдавать ошибки, указывая на то, что в основном потоке слишком много рисунков. - person Akshay Mukadam; 30.05.2018
comment
Вопрос 2 - How can I change status bar colour after collapsing. Ваш ответ меняет фон Toolbar. - person HB.; 11.03.2020

Долго искал решение и нашел. Сначала настройте тему активности на AppThemeNoActionBarLight.SimpleCoordinatorTheme.

Посмотри:

<!-- Base application theme. -->
<style name="AppThemeNoActionBarLight" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppThemeNoActionBarLight.SimpleCoordinatorTheme">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Тогда попробуйте этот образец макета:

<?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:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/main.collapsing"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginStart="48dp"
        app:expandedTitleMarginEnd="64dp"
        app:title="@string/app_name"
        >

        <ImageView
            android:id="@+id/main.backdrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            android:src="@drawable/material_flat"
            app:layout_collapseMode="parallax"
            tools:ignore="ContentDescription"
            />

        <android.support.v7.widget.Toolbar
            android:id="@+id/main.toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:title="Test"

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

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:lineSpacingExtra="8dp"
        android:text="@string/lorem"
        android:padding="@dimen/activity_horizontal_margin"
        />
</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.FloatingActionButton
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_margin="@dimen/activity_horizontal_margin"
    android:src="@drawable/ic_comment_24dp"
    app:layout_anchor="@id/main.appbar"
    app:layout_anchorGravity="bottom|right|end"
    />

person Taras Vovkovych    schedule 12.06.2019