DrawerLayout.openDrawer не работает в первый раз

Я использую android.support.v4.widget.DrawerLayout в своей деятельности. Пока я использую жестом салфетки, чтобы открыть его, он отлично работает.

Однако, когда я хочу открыть его нажатием кнопки, вызывая drawer.openDrawer(Gravity.LEFT), он не работает.

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

Любая идея, как я мог бы решить или обойти это?

Ответ 1

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

Итак, откройте ваш XML файл макета, найдите свой FrameLayout, который представляет ящик, и просто удалите настройки видимости. Теперь мой открывающий тег выглядит следующим образом:

<FrameLayout
    android:layout_width="305dp"
    android:layout_height="match_parent"
    android:layout_gravity="start">

Это сработало для меня.

Приветствия

Ответ 2

Если вы хотите открыть его из верхнего левого переключателя, вы должны реализовать onOptionsItemSelected(MenuItem item)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
     // The action bar home/up action should open or close the drawer.
     // ActionBarDrawerToggle will take care of this.
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch (item.getItemId()) {
    case android.R.id.home:
        return true;
    }
   return super.onOptionsItemSelected(item);
}

Ответ 3

В моем случае видимость NavigationView была отключена в макете. Изменение его на видимое решило проблему

Ответ 4

Используйте метод clearFocus() для объекта DrawerLayout.

Ответ 5

Обнаружена та же проблема и удалось исправить ее, указав ширину элемента содержимого ящика внутри макета.

Без атрибута layout_width ящик не открывался при первом вызове openDrawer() со значением, которое оно делает.

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

<FrameLayout
    android:layout_width="300dp" 
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:background="#ffffff"
    android:id="@+id/drawer_content">
</FrameLayout>

Ответ 6

Слишком глупо, я установил пустой макет, проблема была такой же, как описано выше, когда ящик был вручную перетаскивается в первый раз, после чего кнопка работала, но не перетаскивая ее сначала, навигационный ящик никогда не открывался.

Не устанавливайте пустой макет.

Удаление моего EmptyLayout из ListView, которое представляло NavigationDrawerContent, заставило его работать отлично.

DONT

drawerContentListView.setEmptyView(getLayoutInflater().inflate(R.layout.navigation_drawer_empty_layout, null));

**** стоил мне больше часа.

Ответ 7

Вы можете поместить этот код в свой DrawerLayout:

<android.support.design.widget.NavigationView
 android:id="@+id/nav_view"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:layout_gravity="start"
 app:headerLayout="@layout/nav_header_main"
 app:menu="@menu/activity_main_drawer" />