我在new material design Side Nav spec中看到,你可以在动作栏和状态栏后面显示抽屉.我如何实现这一点?

推荐答案

框架和支持库中的新功能正是实现了这一点.有三块"拼图":

  1. 使用Toolbar,以便可以将操作栏嵌入视图层次 struct .
  2. 制作DrawerLayout fitsSystemWindows,这样它就被放置在系统栏后面了.
  3. 禁用Theme.Material的正常状态栏 colored颜色 ,以便抽屉布局可以在那里绘制.

我假设你会用新的应用软件.

首先,您的布局应该如下所示:

<!-- The important thing to note here is the added fitSystemWindows -->
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Your normal content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- We use a Toolbar so that our drawer can be displayed
             in front of the action bar -->
        <android.support.v7.widget.Toolbar  
            android:id="@+id/my_awesome_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="?attr/colorPrimary" />

        <!-- The rest of your content view -->

    </LinearLayout>

    <!-- Your drawer view. This can be any view, LinearLayout
         is just an example. As we have set fitSystemWindows=true
         this will be displayed under the status bar. -->
    <LinearLayout
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:fitsSystemWindows="true">

        <!-- Your drawer content -->

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

然后在您的活动/片段中:

public void onCreate(Bundled savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Your normal setup. Blah blah ...

    // As we're using a Toolbar, we should retrieve it and set it
    // to be our ActionBar
    Toolbar toolbar = (...) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    // Now retrieve the DrawerLayout so that we can set the status bar color.
    // This only takes effect on Lollipop, or when using translucentStatusBar
    // on KitKat.
    DrawerLayout drawerLayout = (...) findViewById(R.id.my_drawer_layout);
    drawerLayout.setStatusBarBackgroundColor(yourChosenColor);
}

然后,您需要确保DrawerLayout在状态栏后面可见.您可以通过更改您的价值观来做到这一点-v21主题:

values-v21/themes.xml

<style name="Theme.MyApp" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

注: 如果使用<fragment android:name="fragments.NavigationDrawerFragment">而不是

<LinearLayout
    android:layout_width="304dp"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:fitsSystemWindows="true">

    <!-- Your drawer content -->

</LinearLayout>

在实际布局中,如果在从onCreateView方法返回的视图上调用fitsSystemWindows(boolean),则可以实现所需的效果.

@Override
public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View mDrawerListView = inflater.inflate(
        R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setFitsSystemWindows(true);
    return mDrawerListView;
}

Android相关问答推荐

将HTML约束布局转换为Jetpack编写约束布局-链样式、偏差

CameraX与jetpack组成屏幕逻辑

Android设备.Net Maui上的mp3文件列表

组成底部导航栏,自定义形状,周围透明

无法在Jetpack Compose中显示Admob原生广告

如何在Jetpack Compose中使用Box Composable来实现这种布局?

如何将两个变量传递给Nav主机,然后将其传递给另一个屏幕?

两首合成曲的喷气背包动画

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

Jetpack Compose:如何将文本放置在行的右侧?

为什么第二个代码可以安全地在 map 中进行网络调用,因为它已被缓存?

我怎样才能在多行 TextView 旁边有一个 ImageView 并且不超过父级的限制?

修复错误 Invariant Violation: requireNativeComponent: "RNSScreenStackHeaderConfig" was not found in the UIManager

Android Studio:按下前缀键:切换 Logcat 格式

Horizo​​ntalPager 的可组合物中的 LaunchedEffect 问题

JetPack Compose - 卡片行中的权重()不起作用

如何在 Android Studio 中创建新的可组合函数?

Android - 水平(从右到左)圆形背景 colored颜色 过渡

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

线圈单元测试 - 如何做到这一点?