Прозрачная строка состояния и панель инструментов

Я хотел бы интегрировать что-то вроде этого:

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

И я сделал это так, но я не могу представить изображение под панелью инструментов. Без панели инструментов я могу сделать это в строке состояния, но объединение этих двух невозможно.

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

Здесь мой макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context="com.project.android.PhotoActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/photo_tl"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#59000000"
        tools:ignore="UnusedAttribute" />

    <ImageView
        android:id="@+id/photo_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitStart" />


</LinearLayout>

В моей деятельности я сделал следующее:

  getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

Я также объявил файл styles-v21.xml:

<style name="Project.Photo" parent="Project.Light">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">#59000000</item>
</style>

И установите его как стиль по умолчанию для PhotoActivity. Я уже пытался помещать панель инструментов в FrameLayout, но при этом моя панель инструментов просто скрывается, например:

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

Спасибо заранее.

Получил это исправление, но панель инструментов перекрывает строку состояния. Есть ли все-таки, чтобы исправить прокладку? Если я использую android: fitsSystemWindows = "true", строка состояния больше не будет полупрозрачной.

Ответ 1

Как вы сказали,

"Я уже пробовал помещать панель инструментов в FrameLayout, но при этом моя панель инструментов просто скрывается, например:".


Проблема с этим - это порядок добавления childView в FrameLayout, вы добавили панель инструментов в качестве первого дочернего элемента, после чего вы добавили ImageView. поэтому изображение скрывает панель инструментов. Вместо этого порядок представлений внутри FameLayout должен быть таким, как это

<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="match_parent"
          android:fitsSystemWindows="true"
          tools:context="com.project.android.PhotoActivity">

          <ImageView
              android:id="@+id/photo_image"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:adjustViewBounds="true"
              android:scaleType="fitStart" />

          <android.support.v7.widget.Toolbar
              android:id="@+id/photo_tl"
              android:layout_width="match_parent"
              android:layout_height="?attr/actionBarSize"
              android:background="#59000000"
              tools:ignore="UnusedAttribute" />

    </FrameLayout>

Также для уровня API >= 19 вы можете добавить этот атрибут в файл style.xml, чтобы сделать statusBar прозрачным
<item name="android:windowTranslucentStatus">true</item>
Для создания контента позади statusBar используйте эту ссылку

https://developer.android.com/training/system-ui/status.html#behind

Ответ 2

LinearLayout автоматически разместит ImageView ниже Toolbar.

Попробуйте вместо этого использовать RelativeLayout.

Ответ 3

Я удаляю Toolbar из вашего макета и использую реализацию ActionBar из AppCompat.Theme:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Затем я создам новый стиль для полупрозрачного ActionBarvalues/styles.xml:

<style name="AppTheme.Transparent" parent="AppTheme">
    <item name="windowActionBarOverlay">true</item>
</style>

И в v21/styles.xml:

<style name="AppTheme.Transparent" parent="AppTheme">
    <item name="windowActionBarOverlay">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

Я предполагаю, что ваш Activity расширяет AppCompatActivity, а затем в onCreate() вы можете вызвать:

Для включения кнопки возврата:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);

Для установки полупрозрачного цвета:

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.yourTranslucentColor)));

Для удаления заголовка ActionBar:

getSupportActionBar().setDisplayShowTitleEnabled(false);

Более того, я бы изменил ваш корень LinearLayout на CoordinatorLayout, поскольку он дает вам больше контроля над вашими макетами (он более мощный FrameLayout).

Цвет, который я использовал:

<color name="yourTranslucentColor">#29000000</color>

Конечно, вы должны помнить, что примените эту тему к своему Activity в AndroidManifest.xml:

<activity
    android:name=".ui.activity.YourActivity"
    android:theme="@style/AppTheme.Transparent">
</activity>

Выполняя все эти шаги, вы должны получить что-то вроде этого:

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

Пожалуйста, дайте мне знать, если это сработает для вас.

Ответ 4

Используйте код ниже

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="@color/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleTextAppearance="@style/AppTheme.CollapsingToolbarLayoutExpandedTextStyle"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/iv_backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax" />

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

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

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

<!-- Rest of your view-->

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

Ответ 5

Не обрабатывайте строку состояния как нечто отдельное от вашего приложения. Изображение идет под панелью инструментов, потому что вы использовали LinearLayout. Если бы вы использовали RelativeLayout, ваше изображение начиналось с той же высоты, что и панель инструментов.

Теперь для создания прозрачной прозрачности и для запуска всех объектов из панели состояния используйте следующее.

<style name="AppTheme.TranslucentStatusBar" >
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Используйте приведенный выше стиль для своей деятельности, и все начинается с панели статусов. Теперь для панели инструментов вы можете увеличить высоту панели инструментов, добавив высоту строки состояния в качестве дополнения к панели инструментов. Это можно сделать следующим образом:

toolbarContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect frame = new Rect();
                getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
                toolbarContainer.setPadding(0, frame.top, 0, 0);
            }
        });

Вы можете установить цвет в строку состояния и использовать тот же цвет с помощью AlphaTransparency на панели инструментов.

getWindow().setStatusBarColor(ContextCompat.getColor(this, android.R.color.transparent));

Теперь вы контролируете все, включая панель состояния и панель инструментов.

Ответ 6

TL;DR; Вы должны обернуть панель инструментов в LinearLayout.

То, что я сделал, чтобы заставить его работать, было похоже на подход @Akhilesh Kumar, но я завернул панель инструментов в LinearLayout, которая зафиксировала перекрытие панели инструментов. Я также поместил fitsSystemWindows в true в LinearLayout.

<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="match_parent"
android:fitsSystemWindows="true"
tools:context="com.project.android.PhotoActivity">

<ImageView
    android:id="@+id/photo_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    android:scaleType="fitStart"/>

<LinearLayout

    android:id="@+id/content_card_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/photo_tl"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#59000000"
        tools:ignore="UnusedAttribute"/>

</LinearLayout>
</FrameLayout>

Надеюсь, это поможет.

Ответ 7

Получено, что исправлено, но панель инструментов перекрывает строку состояния. Есть ли все-таки, чтобы исправить прокладку? Если я использую android: fitsSystemWindows = "true", строка состояния больше не будет полупрозрачной.

Недавно я написал сообщение о WindowInsets, вы можете проверить его. Я думаю, что это решит вашу проблему.

Короче говоря, вам нужно пройти через окно Toolbar с помощью ViewCompat.setOnApplyWindowInsetListener API. Но родительский элемент Toolbar должен передать вставки окна. В вашем случае это не произойдет, потому что по умолчанию LinearLayout и семейные макеты этого не сделают, вы должны подклассифицировать и переопределить метод onApplyWindowInsets.

Я предлагаю вам прочитать статью, где все описано более точно.

Ответ 8

просто измените высоту панели инструментов на wrap_content:

<android.support.v7.widget.Toolbar
    android:id="@+id/photo_tl"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#59000000"
    tools:ignore="UnusedAttribute" />