У меня есть активность с Navigation Drawer
и с помощью ScrimInsetsFrameLayout
я смог поместить макет под StatusBar
, и все сработало отлично.
Затем я решил заменить цвет для Toolbar
и StatusBar
фоном png
для всего макета активности.
Я запускаю приложение на эмуляторе (Nexus 5 с android 6.0), и результат был именно тем, что я хотел, как вы можете видеть в Изображение № 1 ниже, но когда я попытался на своем устройстве (Galaxy Note 3 с android 5.0) макет внутри ScrimInsetsFrameLayout прошел выше StatusBar
Изображение # 2.
Я не могу понять, что не так, можете ли вы мне помочь?
Вот мои values-v21
и мой activity.xml
<style parent="Theme.AppCompat.Light.NoActionBar" name="AppTheme_Activities">
<item name="android:colorPrimary">@android:color/transparent</item>
<item name="android:colorPrimaryDark">@color/insetF</item>
<item name="android:navigationBarColor">@color/insetF</item>
<item name="android:colorAccent">@color/primary</item>
<item name="android:colorEdgeEffect">@color/primary</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@color/insetF</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
<?xml version="1.0"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/drawer"
android:fitsSystemWindows="true"
android:background="@drawable/background"> <!--png image-->
<FrameLayout
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent">
<include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/>
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/content_frame">
</FrameLayout>
</FrameLayout>
<com.example.myapplication.ScrimInsetsFrameLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/linearLayout"
android:layout_width="304dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:insetForeground="#4000"
android:clickable="true"
android:background="#ffffff"> .....
</com.example.myapplication.ScrimInsetsFrameLayout>
</android.support.v4.widget.DrawerLayout>
Изображение # 1
![введите описание изображения здесь]()
Изображение # 2
![введите описание изображения здесь]()
Ответ 1
![введите описание изображения здесь]()
-
добавьте к onCreate()
Activity
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
-
Измените свойство ScrimInsetsFrameLayout
android:fitsSystemWindows
на false
-
Удалите android:fitsSystemWindows="true"
из DrawerLayout
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/drawer"
android:background="@drawable/background"> <!--png image-->
<FrameLayout
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent">
<include layout="@layout/toolbar_activities" android:id="@+id/toolbar_layout"/>
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/content_frame">
</FrameLayout>
</FrameLayout>
<com.example.myapplication.ScrimInsetsFrameLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/linearLayout"
android:layout_width="304dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="false"
app:insetForeground="#4000"
android:clickable="true"
android:background="#ffffff"> .....
</com.example.myapplication.ScrimInsetsFrameLayout>
</android.support.v4.widget.DrawerLayout>
-
Добавьте эти стили в свою тему AppTheme_Activities
(сохраняя свой желаемый цвет):
<item name="windowActionBarOverlay">false</item>
<item name="android:windowActionBarOverlay">false</item>
<item name="android:fitsSystemWindows">false</item>
<item name="android:statusBarColor">#4000</item>
-
Это будет в состоянии, что панель инструментов также попадает под StatusBar, поэтому вам нужно будет сделать этот взлом:
-
Сделайте Toolbar
height = "wrap_content"
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
-
Установите Padding
для Toolbar
:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
......
......
public int getStatusBarHeight() {
int result = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
}
return result;
}
Это должно быть!
Я загрузил исходный код тестового приложения с помощью навигационного ящика под панелью состояния в мой Dropbox - не забудьте проверить его.
Я ответил на довольно похожий вопрос некоторое время назад - возможно, вам также будет полезно: Прозрачный StatusBar с динамическим цветом ActionBar в Android
Надеюсь, это поможет
Ответ 2
У меня была такая же проблема, Пир. Досадно, что нет похожего приличного руководства, показывающего, как решить эту проблему, даже если это часть руководящих принципов материального дизайна и т.д.
В любом случае, вот как я это сделал...
Стили
My styles.xml
содержит базовую тему, а затем мою основную тему приложения. Я создал еще одну тему для своих действий, которые используют навигационный ящик следующим образом:
<style name="Base.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
</style>
<style name="AppTheme" parent="Base.AppTheme">
<item name="colorPrimary">@color/theme_primary</item>
<item name="colorPrimaryDark">@color/theme_primary_dark</item>
<item name="colorAccent">@color/theme_accent</item>
</style>
<style name="AppTheme.NavDrawer">
<item name="android:windowBackground">@color/window_background</item>
</style>
Цвет window_background
ссылается на мой файл colors.xml
, который перечисляет его как #FFF5F5F5
. Обратите внимание, что вышеприведенное несколько отличается для API 21+, поэтому в каталоге values-v21
создайте еще один styles.xml
. Это должно включать следующее:
<style name="AppTheme.NavDrawer">
<item name="android:windowBackground">@color/window_background</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
Макеты
Теперь для макетов. В файле макета вы будете иметь свой навигационный ящик, вы можете включить следующее.
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" >
<!-- The main content view -->
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/main_adView">
<!-- The app bar -->
<android.support.design.widget.AppBarLayout
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
style="@style/AppTheme.Toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>
<!-- Your layout content below -->
<FrameLayout
android:id="@+id/your_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<!-- Other stuff here if you like -->
</RelativeLayout>
<!-- The navigation drawer -->
<include layout="@layout/navdrawer"
android:id="@+id/main_navigationView" />
Очевидно, вы можете удалить RelativeLayout
, если вам не нужны какие-либо другие представления внутри него, поскольку это было бы излишним. Ящик навигации, на который я ссылался в теге <include>
, находится ниже:
<android.support.design.widget.NavigationView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="@dimen/navdrawer_width"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/navdrawer_header"
app:menu="@menu/navdrawer_items" />
С помощью вышеуказанного кода вы должны правильно нарисовать свой навигационный ящик за панель состояния.