如何为继承Activity类的主Activity添加Android Studio Navigation Drawer布局
嘿,我太懂你这种投入大量时间后不想推翻现有代码的纠结了——毕竟谁也不想把MainActivity从Activity改成AppCompatActivity后面对一堆编译错误。其实有几个不用改基类就能实现Navigation Drawer的办法,给你梳理下:
方案一:手动基于原生DrawerLayout实现(最推荐)
AndroidX的DrawerLayout本身并不依赖AppCompatActivity,完全可以直接在普通Activity里使用,不用管AS模板的限制。步骤如下:
- 先在你的布局文件里,把根布局改成
DrawerLayout,结构大概是这样:<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 你的主内容布局,比如原来的Activity布局 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 这里放你原来的内容 --> </LinearLayout> <!-- 侧边栏布局,用NavigationView或者自定义布局都可以 --> <com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/nav_menu" /> <!-- 你的侧边栏菜单 --> </androidx.drawerlayout.widget.DrawerLayout> - 在Activity里初始化DrawerLayout和触发按钮:
private DrawerLayout drawerLayout; private ActionBar actionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = findViewById(R.id.drawer_layout); actionBar = getActionBar(); // 显示ActionBar的返回按钮作为汉堡触发键 if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_hamburger); // 替换成你的汉堡图标 } // 设置NavigationView的菜单点击监听 NavigationView navView = findViewById(R.id.nav_view); navView.setNavigationItemSelectedListener(item -> { // 处理菜单点击逻辑 drawerLayout.closeDrawer(GravityCompat.START); return true; }); } // 处理ActionBar按钮点击,打开抽屉 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { drawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } - 记得在build.gradle里添加必要的依赖:
implementation 'androidx.drawerlayout:drawerlayout:1.2.0' implementation 'com.google.android.material:material:1.9.0' // 如果用NavigationView的话
方案二:用AppCompatDelegate兼容AppCompat特性
如果想直接用AS模板里的Navigation Drawer逻辑,又不想改基类,可以通过AppCompatDelegate在普通Activity里启用AppCompat的功能:
- 在Activity里初始化AppCompatDelegate,并委托生命周期方法:
private AppCompatDelegate delegate; @Override protected void onCreate(Bundle savedInstanceState) { // 先初始化delegate delegate = AppCompatDelegate.create(this, null); delegate.installViewFactory(); delegate.onCreate(savedInstanceState); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 接下来就可以像AppCompatActivity一样使用Toolbar、NavigationView等组件了 Toolbar toolbar = findViewById(R.id.toolbar); delegate.setSupportActionBar(toolbar); DrawerLayout drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); // 这里可以用NavigationUI来绑定Drawer和Toolbar ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); navigationView.setNavigationItemSelectedListener(this); } // 重写生命周期方法,委托给delegate @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); delegate.onPostCreate(savedInstanceState); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (delegate.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } // 其他生命周期方法比如onStart、onStop、onDestroy也最好委托给delegate @Override protected void onStart() { super.onStart(); delegate.onStart(); } @Override protected void onStop() { super.onStop(); delegate.onStop(); } @Override protected void onDestroy() { super.onDestroy(); delegate.onDestroy(); }
这个方法相当于在普通Activity里“注入”了AppCompat的能力,不用改基类就能用所有AppCompat的组件和逻辑。
方案三:轻量级第三方抽屉库(备选)
如果上面两种方法都觉得麻烦,也可以找一些不依赖AppCompat的第三方Drawer库,比如DrawerLayout的替代实现,直接集成到普通Activity里。不过个人更推荐前两种,因为原生组件更稳定,后续维护成本低。
内容的提问来源于stack exchange,提问作者אריאל עדן
相关产品推荐
相关产品推荐

