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
![Screen Capture]()
![Translucent on KitKat]()
Ответы
Ответ 1
У меня есть крошечный "трюк", полученный из 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 в ящик, чтобы исправить это.
Ответ 2
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>
Ответ 3
Я опубликовал трюк, который делает это возможным в предыдущих версиях Android L.
Вы можете найти мое решение в этом сообщении. Надеюсь, что это может быть полезно кому-то.
Ответ 4
Если вы не хотите использовать lib или этот взлом:
- Расширить "Theme.AppCompat.NoActionBar"
- Перенесите первый элемент вашего DrawerLayout в LinearLayout.
-
Добавьте панель инструментов к этому LinearLayout.
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:minHeight="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleTextColor="@android:color/white"
android:background="?attr/colorPrimary">
</android.support.v7.widget.Toolbar>
-
в Activity добавьте следующую строку после setContentView
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
- теперь он должен работать.