2015-02-03 4 views
30

Я разрабатываю Activity, где мне нужно сделать панель навигации непрозрачной, а строка состояния прозрачной на устройствах с 5.0+ (API 21+). Ниже приведены стили, которые я использую, а также объяснение моей проблемы.Прозрачная строка состояния, не работающая с windowTranslucentNavigation = "false"

AppTheme расширяет Theme.AppCompat.Light.NoActionBar

<item name="android:statusBarColor">@color/transparent</item> 
<item name="android:windowActionBar">false</item> 
<item name="android:windowDrawsSystemBarBackgrounds">true</item> 
<item name="android:statusBarColor">@color/welbe_red_transparent</item> 

FullscreenTheme расширяет AppTheme

<item name="android:windowNoTitle">true</item> 
<item name="android:statusBarColor">@color/transparent</item> 
<item name="android:windowTranslucentNavigation">true</item> 

Это делает приложение выглядеть следующим образом

android:windowTranslucentNavigation="true"

Если удалить android:windowTranslucentNavigation стиль, или установите его в falseFullscreen, это устраняет проблему навигационной панели. Проблема заключается в том, что строка состояния становится полностью белой, а не прозрачной и отображает содержимое за ней.

android:windowTranslucentNavigation="false"

Я попытался с помощью fitsSystemWindow="true" в моих макетах, но не решить проблему. Кто-нибудь знает, почему это происходит?

+0

Я немного неясен относительно того, что вы действительно хотите: панель навигации по умолчанию, прозрачная строка состояния и фон за панель состояния. Верный? –

+0

Да, это именно то, что я хочу отобразить. Когда я отключу «андроид: windowTranslucentNavigation», фон перестает расширяться за панель состояния. –

ответ

47

android:windowTranslucentNavigation делает одну вещь, что android:statusBarColor не делает, который запрашивает SYSTEM_UI_FLAG_LAYOUT_STABLE и SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN флаги.

Это те, которые вам нужно запросить, чтобы оторваться от строки состояния.

Запрос их в onCreate из ваших Activity:

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

В качестве альтернативы вы можете просто установить приложение фон тему, и это будет также всплывало за строкой состояния.

Дополнительная информация here.

+2

То, что мне нужно! Спасибо. Документы говорят «скорректируйте флаги окна по мере необходимости», но не упомянуть, какие флаги ... –

+0

После долгих поисков и часов усилий я наконец нашел ответ здесь. Большое большое спасибо. В качестве дополнительной заметки мы должны удалить 'fitsSystemWindows', чтобы это работало правильно. – Atul

3

Насколько я знаю, нет правильного способа установить цвет в строке состояния на APIs ниже 19.

Для API 19+ вы можете использовать подобный атрибут windowTranslucentNavigation только для строки состояния:

<item name="android:windowTranslucentStatus">true</item> 

Примечания:

  • причина вы получали белую строку состояния из-за

    <item name="android:statusBarColor">@color/transparent</item> 
    
  • Есть some hacks, которые работают на определенных устройствах производителя, но я бы не использовать их сам.

+0

Я понимаю, как выполнить это в обратной совместимости, я использую разные стили на '19 +' и '21 +'. Фон должен находиться в прозрачной строке состояния на '21 +', но комбинация настроек, которые я использую с AppCompat, когда-то нарушает эту функцию. Этот ответ на самом деле не отвечает на вопрос. –

+0

@AustynMahoney «Мне нужно сделать панель навигации непрозрачной, сохраняя при этом статусную строку прозрачной на 5.0+». «Мне также нужно, чтобы это работало на minSdkVersion 14+» - не будет работать, только с 19+. Тогда каков ваш вопрос? – Simas

+0

Вопрос все тот же. Почему выключение «android: windowTranslucentNavigation» останавливает фон, полностью устанавливая системное окно (причина, по которой строка состояния является белой). Мне не нужна прозрачность для работы над 14+ (я знаю, что это невозможно), я просто указываю, что решение должно использовать темы/стили AppCompat для обеспечения обратной совместимости. –

1

Я борюсь с этим более 3 часов. Заверните все в CoordinatorLayout это только один, который, кажется, обратить внимание на fitsSystemWindow = «истина» или «ложь»

Это мой основной фрагмент активности

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/content_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

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

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

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

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

это моя панель макета

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

    <android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     android:theme="@style/ToolbarTheme" 
     app:popupTheme="@style/AppTheme.PopupOverlay"> 

     <android.support.v7.widget.AppCompatImageView 
      android:layout_width="wrap_content" 
      android:layout_height="?actionBarSize" 
      android:layout_centerHorizontal="true" 
      android:layout_gravity="center" 
      android:adjustViewBounds="true" 
      app:srcCompat="@drawable/ic_fynd_logo_red"/> 

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

Как вы можете видеть, моя схема фрагмента делает карту google отображаемой в строке состояния.

У меня есть панель действий, где идет логотип компании.

И другие кнопки ui «layout_action_buttons» также завернуты в макет координатора, поэтому работает fitsSystemsWindows.

Проверьте это.

enter image description here

+0

Можете ли вы показать, как выглядеть на компас на карте Google? Потому что для меня всегда находится верхняя строка состояния, и у меня есть проблема с перемещением кнопок google maps. – Peter

+0

Вы можете добавить дополнение к своей карте google. Используйте это, mMap.setPadding (10, 20, 10, 10); Вот как вы избегаете компонентов вашей карты, попадающих под панель. –

+0

@Peter также проверяет принятый ответ, если эти флаги в вашей активности будут делать трюк в строке состояния и даже позже изменить цвет строки состояния. –

0

Это ответить на вопрос @Gaurav Арора в.

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

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

Вы можете иметь иконки в черный после API 23, используя

<item name="android:windowLightStatusBar">true</item> 

В вашей теме. Но если это не так, вы можете сделать что-то подобное, чтобы динамически менять цвет строки состояния.

/** 
    * Modify decor view with transparent state. 
    * 
    * @param context  Android context 
    * @param window  Window 
    * @param transparent true to set the status bar color to transparent, false otherwise 
    */ 
    public static void setUpDecorView(Context context, Window window, boolean transparent) { 
//  View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | 
//  WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      window.getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

      window.setStatusBarColor(ContextCompat.getColor(context, transparent ? R.color.transparent : R.color.primary_dark)); 

     } else { 
      window.getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

      window.setStatusBarColor(ContextCompat.getColor(context, transparent ? R.color.transparent : R.color.primary_dark)); 
     } 

    } 

Я имел эту функцию, потому что у меня есть нижний лист в моем UI, и каждый раз, когда нижний лист пошел в раскрытое состояние я нуждался в строке состояния должна быть окрашена.

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

Смежные вопросы