是否有正确的方法将 Appcompat "NavigationView" 用作永久性的(参见 Material 设计指南)

Is there a proper way to use the Appcompat "NavigationView" as permanent (see Material Design guidelines)

通过阅读有关导航抽屉(Drawerlayout + NavigationView)的 Material 设计指南,我看到有一条建议将其设置为始终在桌面上打开。这就是我想在平板电脑上实现的目标。

Permanent navigation drawers are always visible and pinned to the left edge, at the same elevation as the content or background. They cannot be closed.

不过好像support library里提供的widget不太好操作,达到这样的效果。

我是不是漏掉了什么,或者有什么简单的方法可以让它在 tablets/desktop/TV 上打开吗?

我当前的 phone 布局:

<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" />

我会创建一个布尔资源值并使用它来为此设置抽屉锁定模式。例如:

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)
}

除了 DevrimTuncer 的答案,我还找到了这个 post:http://derekrwoods.com/2013/09/creating-a-static-navigation-drawer-in-android/

除了:

 drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, drawerList);

我们还必须设置:

drawerLayout.setScrimColor(Color.TRANSPARENT);

并添加一些边距:

values/dimens.xml

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

values-sw720dp-land/dimens.xml

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

如果您不想将导航视图用作抽屉,请不要将 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 英寸及以上的平板电脑上。