Я видел в новом дизайне материала Side Nav спецификации, что вы можете отобразить ящик над панелью действий и за строкой состояния. Как я могу это реализовать?
android
navigation-drawer
android-appcompat
Крис Бейнс
источник
источник
Ответы:
Новая функциональность в фреймворке и поддержка библиотек позволяют именно это. Есть три «кусочка головоломки»:
fitsSystemWindows
так, чтобы он располагался позади системных панелей.Theme.Material
нормальной окраски строки состояния, чтобы DrawerLayout мог рисовать там.Я предполагаю, что вы будете использовать новый appcompat.
Во-первых, ваш макет должен выглядеть так:
Затем в вашей деятельности / фрагмент:
Затем вам нужно убедиться, что DrawerLayout виден за строкой состояния. Вы делаете это, изменяя тему values-v21:
Значения-V21 / themes.xml
Примечание. Если
<fragment android:name="fragments.NavigationDrawerFragment">
вместоВ реальном макете желаемый эффект будет достигнут, если вы вызовете
fitsSystemWindows(boolean)
представление, которое вы возвращаете изonCreateView
метода.источник
DrawerLayout
нужно выложить за решетку системы. Затем вам нужно установить его на вид ящика так, чтобыDrawerLayout
он располагался внутри вставок окна.layout_marginTop
в корне макета содержимого вашего ящика. В противном случае фон макета содержимого вашего ящика будет отображаться в верхней части строки состояния, а все остальное будет перемещено вниз. Это, однако, кажется довольно грубым решением, насколько я знаю, что нет? Attr / statusBarSize или чего-то подобного, поставляемого Android.РЕДАКТИРОВАТЬ: Новая библиотека поддержки дизайна поддерживает это, и предыдущий метод больше не требуется.
Теперь это можно сделать с помощью новой библиотеки поддержки дизайна Android .
Вы можете увидеть пример приложения Cheesesquare от Chris Banes, который демонстрирует все новые функции.
Предыдущий метод:
Поскольку полное решение не опубликовано, вот способ, которым я достиг желаемого результата.
Сначала включите ScrimInsetsFrameLayout в свой проект.
Затем создайте стиль, чтобы
insetForeground
можно было установить.Значения / attrs.xml
Обновите xml-файл своей деятельности и убедитесь, что
android:fitsSystemWindows
установлено значение true как для,DrawerLayout
так и дляScrimInsetsFrameLayout
.макет / activity_main.xml
Внутри метода onCreate вашей деятельности установите цвет фона строки состояния на макете ящика.
MainActivity.java
Наконец, обновите тему вашего приложения, чтобы
DrawerLayout
она была за строкой состояния.Значения-V21 / styles.xml
Результат:
источник
С выпуском последней библиотеки поддержки Android (версия 22.2.0) у нас появилась библиотека поддержки дизайна и, как часть этого, новое представление под названием NavigationView . Таким образом, вместо того, чтобы делать все самостоятельно с помощью
ScrimInsetsFrameLayout
всего прочего, мы просто используем эту точку зрения, и все сделано для нас.пример
Шаг 1
Добавьте в
Design Support Library
свойbuild.gradle
файлШаг 2
Добавьте
NavigationView
к своемуDrawerLayout
:Шаг 3
Создайте новый ресурс меню
/res/menu
и добавьте элементы и значки, которые вы хотите отобразить:Шаг 4
Запустите NavigationView и обработайте события кликов:
Шаг 5
Обязательно установите
android:windowDrawsSystemBarBackgrounds
иandroid:statusBarColor
вvalues-v21
противном случае ваш ящик не будет отображаться «под» StatusBarНеобязательный шаг
Добавьте заголовок в NavigationView. Для этого просто создайте новый макет и добавьте
app:headerLayout="@layout/my_header_layout"
в NavigationView.Результат
Ноты
colorPrimary
атрибутаtextColorPrimary
атрибутаtextColorSecondary
атрибутаВы также можете проверить пример приложения на Криса Бэйнс , который выдвигает на первый план NavigationView наряду с другими новыми видами , которые являются частью библиотеки поддержки проектирования (например , в FloatingActionButton , TextInputLayout , закусочная , TabLayout и т.д.)
источник
<item name="itemTextColor">@color/YOUR_COLOR</item>
<item name="itemIconTint">@color/YOUR_COLOR</item>
Toolbar
- нет никакого способа сделать это сActionBar
mDrawerLayout.openDrawer(GravityCompat.START);
куда хотите. Если вы используете это,ActionBarDrawerToggle
это должно быть сделано автоматически, как только вы нажмете на значок гамбургера.Чтобы это работало, в values-v21 styles или theme xml необходимо использовать этот атрибут:
<item name="android:windowTranslucentStatus">true</item>
Это делает волшебство!
источник
Все вышеперечисленные подходы верны и могут работать. Я создал рабочую демонстрацию, следуя вышеприведенному руководству, и протестировал на 2.x до 5.x
Вы можете клонировать из Github
Важная вещь для игры в основной деятельности
и перезвонить
Абсолютно тема для V21 делает волшебство
и ScrimInsetsFrameLayout
Теперь это стало проще с новой библиотекой поддержки проектирования
клон из @Chris Banes https://github.com/chrisbanes/cheesesquare
источник
Все упомянутые здесь ответы слишком стары и длинны. Лучшее и короткое решение, которое работает с последним Navigationview, это
это изменит цвет строки состояния на прозрачный при открытии ящика
Теперь, когда вы закрываете ящик, вам нужно снова изменить цвет строки состояния на темный. Так что вы можете сделать это таким образом.
а затем в основной макет добавить одну строку, т.е.
и ваш макет ящика будет выглядеть
и ваш вид навигации будет выглядеть
Я проверил его, и он полностью работает. Надеюсь, он кому-нибудь поможет. Это может быть не самый лучший подход, но он работает гладко и прост в реализации. Пометьте, если это поможет. Счастливое кодирование :)
источник
Я использую библиотеку поддержки дизайна. И просто используя собственную тему, я получил прозрачную строку состояния при открытии окна навигации.
Наконец добавьте тему в Manifest File
Не забудьте использовать свойство,
android:fitsSystemWindows="true"
в «DrawerLayout»источник
Это самое простое, и у меня это сработало:
В значениях-21:
В значениях:
И установить на свою панель инструментов
источник
24dp
для верхней границы.Вместо использования
ScrimInsetsFrameLayout
... Не проще ли просто добавить представление с фиксированной высотой24dp
и фономprimaryColor
?Я понимаю, что это предполагает добавление фиктивного представления в иерархию, но мне кажется, что оно чище.
Я уже попробовал, и это работает хорошо.
источник
Попробуйте с этим:
стиль :
Основная деятельность расширяет ActionBarActivity
Теперь вы можете,
onCreateOptionsMenu
как обычный ActionBar с ToolBar.Это мой макет
Надеюсь, вы понимаете! Веселитесь!
источник