Android Navigation Drawer сверху ActionBar

Я пытаюсь сделать навигационный ящик над панелью действий, когда он скользит вправо, как это приложение: [Удалено]

Это мой основной вид деятельности:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout ...> <RelativeLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> ... </RelativeLayout> <fragment android:name="com...." android:layout_gravity="start" android:id="@id/navigation" android:layout_width="@dimen/navigation_menu_width" android:layout_height="fill_parent" /> </android.support.v4.widget.DrawerLayout> 

Некоторые другие вопросы о stackoverflow аналогичны, например, этот вопрос, но все ответы рекомендуют использовать скользящее меню lib. Но это приложение все еще использует android.support.v4.widget.DrawerLayout, и они преуспевают. Не спрашивайте меня, как я знаю, что они используют стандартный навигационный ящик, но я уверен в этом.

Был бы очень признателен за вашу помощь.


ЗДЕСЬ ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ : огромное спасибо @Peter Cai ЭТО РАБОТАЕТ СОВЕРШЕННО. https://github.com/lemycanh/DrawerOnTopActionBar

СкриншотПрозрачный на KitKat

Solutions Collecting From Web of "Android Navigation Drawer сверху ActionBar"

У меня есть крошечный «трюк», полученный из https://github.com/jfeinstein10/SlidingMenu, чтобы реализовать необходимый эффект.

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

Ниже приведены некоторые подробные шаги для этого.

Сначала создайте xml с именем «decor.xml» или что угодно. Вставьте только DrawerLayout и ящик. «FrameLayout» ниже – это просто контейнер. Мы будем использовать его, чтобы обернуть контент вашей деятельности.

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout ...> <FrameLayout android:id="@+id/container" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <fragment android:name="com...." android:layout_gravity="start" android:id="@id/navigation" android:layout_width="@dimen/navigation_menu_width" android:layout_height="fill_parent" /> </android.support.v4.widget.DrawerLayout> 

А затем удалите DrawerLayout в вашем основном макете. Теперь макет вашего основного вида деятельности должен выглядеть так:

 <RelativeLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> ... </RelativeLayout> 

Мы предполагаем, что макет основной деятельности называется «main.xml».

В своем MainActivity напишите следующим образом:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Inflate the "decor.xml" LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.decor, null); // "null" is important. // HACK: "steal" the first child of decor view ViewGroup decor = (ViewGroup) getWindow().getDecorView(); View child = decor.getChildAt(0); decor.removeView(child); FrameLayout container = (FrameLayout) drawer.findViewById(R.id.container); // This is the container we defined just now. container.addView(child); // Make the drawer replace the first child decor.addView(drawer); // Do what you want to do....... } 

Теперь у вас есть DrawerLayout, который может скользить по ActionBar. Но вы можете обнаружить, что он включен в строку состояния. Возможно, вам понадобится добавить paddingTop в ящик, чтобы исправить это.

UPDATE: как наложить панель действий на навигационный ящик. (С новой панелью инструментов) Используйте их в своих зависимостях в файле build.gradle

 compile 'com.android.support:appcompat-v7:21.0.0' compile 'com.android.support:support-v4:21.0.0' 

Это как ваш drawerlayout

 <!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/layout_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar"/> <!-- As the main content view, the view below consumes the entire space available using match_parent in both dimensions. --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white"/> </LinearLayout> <fragment android:id="@+id/navigation_drawer" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/list_background" /> </android.support.v4.widget.DrawerLayout> 

Создайте новый файл toolbar.xml в папке макета.

 <?xml version="1.0" encoding="utf-8"?> <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_height="wrap_content" android:layout_width="match_parent" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" /> 

Перейдите к вашей деятельности, которая расширяет навигационный ящик. И добавьте это после SetContentView ()

 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); 

Не забудьте расширить свою тему NoActionBar в папке с вашими значениями.

 <style name="Theme.Whtsnxt" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="windowActionBar">false</item> <!-- colorPrimary is used for the default action bar background --> <item name="windowActionModeOverlay">true</item> <item name="android:textColorPrimary">@color/white</item> <item name="colorPrimary">@color/splashscreen</item> <item name="colorPrimaryDark">@color/holo_blue_light</item> <item name="android:windowBackground">@color/white</item> <item name="android:colorBackground">@color/white</item> </style> 

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