DrawerLayout:侧滑抽屉 · AndroidX 源码指南
AAndroidX 源码指南
View 体系
View 体系 · androidx.core

DrawerLayout:侧滑抽屉Core 1.20.0-alpha01

打开/关闭、锁定模式、监听器,以及边缘滑动抽屉的配置。

最后更新 2026-08-01

复制即用

<androidx.drawerlayout.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 主内容:必须是第一个子 View -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- 抽屉:layout_gravity 决定方向 -->
    <FrameLayout
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#fff" />

</androidx.drawerlayout.widget.DrawerLayout>

代码控制:

import androidx.drawerlayout.widget.DrawerLayout;

DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.openDrawer(GravityCompat.START);
drawer.closeDrawer(GravityCompat.START);

// 锁定:阻止用户手势打开
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

// 监听状态
drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
    @Override
    public void onDrawerSlide(View drawerView, float slideOffset) {}
    @Override
    public void onDrawerOpened(View drawerView) {}
    @Override
    public void onDrawerClosed(View drawerView) {}
    @Override
    public void onDrawerStateChanged(int newState) {}
});

常见陷阱

  • 主内容不是第一个子 View:第一个子 View 必须是主内容,否则抽屉行为异常。
  • 忘加 layout_gravity:抽屉没有 gravity 不会被识别。
  • 锁定模式忘恢复LOCK_MODE_LOCKED_CLOSED 后记得在合适时机恢复 LOCK_MODE_UNLOCKED
  • 边缘滑动冲突setDrawerEdgeLockEnabled(API 27+)控制边缘手势,与列表侧滑冲突时注意。

要点

  • 主内容必须是第一个子 View;抽屉用 layout_gravity 声明方向(start/end/left/right)。
  • 状态常量:STATE_IDLE/STATE_DRAGGING/STATE_SETTLING
  • 锁定模式:LOCK_MODE_UNLOCKEDLOCK_MODE_LOCKED_CLOSEDLOCK_MODE_LOCKED_OPEN
  • ToolbarsetSupportActionBar + ActionBarDrawerToggle 搭配可实现汉堡按钮联动。
  • Compose 中优先使用 ModalNavigationDrawer,不需要此库。

相关页面