Есть ли правильный способ использовать Appcompat NavigationView как постоянный (см. Рекомендации по дизайну материалов)

Прочитав руководство по дизайну материалов о навигационном ящике (Drawerlayout + NavigationView), я вижу, что есть рекомендация всегда открывать его на рабочем столе. Вот чего я хотел бы добиться на планшетах.

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

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

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

Я что-то пропустил, или есть простой способ открыть его на планшетах/рабочем столе/телевизоре?

Мой текущий макет телефона:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primarycolor"
        android:minHeight="?attr/actionBarSize"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

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


<!-- The navigation drawer   style="@style/NavDrawer"

                 android:background="@android:color/white"-->
<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    app:headerLayout="@layout/nav_header"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:menu="@menu/nav" />


person Waza_Be    schedule 02.02.2016    source источник
comment
Вы ищете lockMode? developer.android.com/reference/android/ поддержка/v4/виджет/, интервал)   -  person Devrim    schedule 02.02.2016


Ответы (3)


Если вы не хотите использовать представление навигации в качестве ящика, не помещайте NavigationView непосредственно внутрь DrawerLayout.

<DrawerLayout>
    <LinearLayout>
        <NavigationView android:layout_width="320dp" />
        <LinearLayout android:orientation="vertical">
            <Toolbar/>
            <FrameLayout android:id="@+id/content_frame" />
        </LinearLayout>
    </LinearLayout>
</DrawerLayout>

Поместите этот макет внутрь /res/layout-sw600dp-land. Ваш исходный макет будет загружен на телефоны, а этот — на планшеты 7 дюймов и выше в альбомной ориентации.

person Eugen Pechanec    schedule 02.02.2016
comment
ОМГ, это так просто, почему я это пропустил? - person Waza_Be; 03.02.2016
comment
Примечание. Я полностью удалил DrawerLayout, есть ли смысл его оставлять? - person Waza_Be; 03.02.2016
comment
Только если вы хотите использовать правый ящик для чего-то. - person Eugen Pechanec; 03.02.2016
comment
Единственная проблема, которую я видел, — это фокус, который сходит с ума: навигационный вид теряет фокус после выбора элемента"> stackoverflow.com/questions/38992356/ - person Waza_Be; 19.08.2016

В дополнение к ответу DevrimTuncer я нашел этот пост: http://derekrwoods.com/2013/09/creating-a-static-navigation-drawer-in-android/

В дополнение к:

 drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, drawerList);

Мы также должны установить:

drawerLayout.setScrimColor(Color.TRANSPARENT);

И добавьте немного полей:

значения/размеры.xml

<resources>
    <dimen name="drawer_size">240dp</dimen>
    <dimen name="drawer_content_padding">0dp</dimen>
</resources>

значения-sw720dp-land/dimens.xml

<resources>
    <dimen name="drawer_content_padding">240dp</dimen>
</resources>
person Waza_Be    schedule 02.02.2016

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

res
  -- values
    -- drawer_layout_values.xml
         <bool name="drawer_layout_locked">false</bool>
  -- values-sw720dp
    -- drawer_layout_values.xml
         <bool name="drawer_layout_locked">true</bool>

Код:

if(getResources().getBoolean(R.bool.drawer_layout_locked)) {
    drawerLayoutInstance.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_OPEN)
}
person Devrim    schedule 02.02.2016