Intereting Posts
Установите яркость / контрастность в видеозахвате с помощью Android Camera2 Получение информации о продуктах, таких как имя, цена и т. Д. С использованием номера штрих-кода Что на самом деле выполняет репо init и repo sync? Как вы используете Intent.FLAG_ACTIVITY_CLEAR_TOP, чтобы очистить стек активности? Eclipse issue – Ошибка запуска: Не удалось подключиться к удаленной виртуальной машине. Время соединения истекло Фрактальные приложения на Android Как сделать размер экрана для GridLayout Создайте новый Android-проект на базе Gradle в IntelliJ IDEA Установите модуль в опции «Редактировать конфигурации» в программе intelliJ / Android Studio? Android убрать клавиатуру Как определить правильную ориентацию устройства в многоэкранном режиме Android N? Какая разница между компиляцией, testCompile и предоставлена ​​в зависимости от градиента Android Expansion apk Как получить Uri изображения, хранящегося на SDCARD? Строительство проекта Android Studio на Jenkins? Android.compileSdkVersion отсутствует

Android Navigation Drawer и windowActionBarOverlay = true

Я пытаюсь реализовать новый Android-навигатор в моем приложении. Я создал BaseActivity.java, который обрабатывает установку и прослушиватели ящика, и у меня есть две субактивности, которые расширяют этот базовый класс. Во втором действии я планирую использовать другой стиль панели действий, используя следующие attrs:

<item name="android:windowActionBarOverlay">true</item> <item name="android:background">@android:color/transparent</item> 

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

Я добился именно этого, но теперь проблема в том, что, поскольку контент расширяется, чтобы использовать дополнительное пространство для использования ActionBar в качестве наложения, сам ящик навигации также расширяется, и он перекрывает ActionBar, создавая довольно ужасный Выглядящий макет:

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

То, что я хотел бы сделать, – это фактический контент (макет кадра, который будет заполнен фрагментом), чтобы заняться дополнительным пространством, но теперь ящик nav остается под панелью действий, похожей на приложение Play Music:

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

Любые идеи о том, что я могу сделать, чтобы это произошло?

EDIT Итак, по marginTop Ахмада я установил marginTop только в ListView. Вот макет:

 <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_marginTop="?android:attr/actionBarSize" <!-- This was added after seeing the crazy effect, but does nothing --> android:layout_marginBottom="0dp" android:layout_marginLeft="0dp" android:layout_marginRight="0dp" android:layout_width="240dp" android:layout_height="fill_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:background="?attr/listviewBackground" /> 

И теперь, он отлично работает для верхней стороны, но по какой-то причине в нижней части обзора есть также поле, которое вообще не имеет для меня никакого смысла. Вот скриншот .

Не уверен, что вызывает это 🙁

Solutions Collecting From Web of "Android Navigation Drawer и windowActionBarOverlay = true"

И теперь, он отлично работает для верхней стороны, но по какой-то причине в нижней части обзора есть также поле, которое вообще не имеет для меня никакого смысла. Вот скриншот.

Если вы установите силу тяжести ListView для начала, то она решает вашу проблему. Никакой дополнительный запас не добавляется внизу. Похоже, что начальная сила DrawerLayout начинается с центра

 <ListView android:id="@+id/left_drawer" android:layout_marginTop="?android:attr/actionBarSize" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start|bottom"/> 

В случае, если кто-то заинтересован в другом вопросе на этот вопрос. Вот что произошло.

Я попытался установить только край в верхней части списка, например:

 android:layout_marginTop="?android:attr/actionBarSize" 

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

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

Вот что я сделал:

  • Установите Заполнение в верхней части списка ListView, а не margin:

    android:paddingTop="?android:attr/actionBarSize"

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

  • Создайте пользовательский чертеж, который имеет прозрачную верхнюю часть, а затем остальную часть сплошного цвета:

Это выглядит примерно так:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="#80000000" /> </shape> </item> <item android:top="@dimen/action_bar_default_height"> <shape android:shape="rectangle"> <solid android:color="@color/light_gray" /> </shape> </item> 

Обратите внимание, что я попытался использовать ?android:attr/actionBarSize на ?android:attr/actionBarSize , но это заставило силу приложения закрыть. Вместо этого я просмотрел grepcode и нашел несколько файлов dimen разных размеров для панели действий, поэтому я добавил их в файлы размера моего собственного проекта.

  • Для значений: 48dp
  • Для ценностей – земля: 40dp
  • Для значений-sw600dp: 56dp

И после этого, я думаю, я отлично смотрю, заметьте на скриншоте, как список и панель действий не перекрываются, а прозрачная часть списка – это только правильный размер.

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

Надеюсь, что это поможет любому, кто задавался вопросом, как этого добиться.

Вы можете установить маржу в верхней части вашего макета, чтобы контент рисовал себя ниже ActionBar.

Просто добавьте это в свой родительский макет:

 android:layout_marginTop="?android:attr/actionBarSize" 

Атрибут actionBarSize относится, как вы уже догадались, к размеру ActionBar . Вы не можете установить абсолютное значение в качестве поля, так как ActionBar не всегда имеет одинаковый размер на всех устройствах Android (он больше на планшетах, меньше на устройствах телефонной трубки).

Редактировать:

Установите маржу в ListView .

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <ListView android:id="@+id/left_drawer" android:layout_marginTop="?android:attr/actionBarSize" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start"/> </android.support.v4.widget.DrawerLayout> 

Приложение Google Music делает то же самое:

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

Я решил эту проблему, используя paddingTop :

 <FrameLayout android:id="@+id/menu_frame" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:paddingTop="?attr/actionBarSize" > <ListView android:id="@+id/left_drawer_list" android:layout_width="240dp" android:layout_height="match_parent" /> </FrameLayout> 

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

Я создал рабочую демонстрацию, следуя приведенному выше руководству, и протестировал ее на 2.x до 5.x

Вы можете клонировать из Github

Главное, что нужно сыграть в главной деятельности

  toolbar = (Toolbar) findViewById(R.id.toolbar); res = this.getResources(); this.setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout) findViewById(R.id.linearLayout); scrimInsetsFrameLayout.setOnInsetsCallback(this); } 

И обратный вызов

 @Override public void onInsetsChanged(Rect insets) { Toolbar toolbar = this.toolbar; ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); lp.topMargin = insets.top; int top = insets.top; insets.top += toolbar.getHeight(); toolbar.setLayoutParams(lp); insets.top = top; // revert } 

Абсолютно Тема для V21 делает волшебство

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- API 21 theme customizations can go here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/accent_material_light</item> <item name="windowActionModeOverlay">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowTranslucentStatus">true</item> </style>