Android development
setDrawerListener
DrawerLayout
deprecated methods
Android API

Method setDrawerListener is deprecated

Master System Design with Codemia

Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.

Introduction

The setDrawerListener() method on Android's DrawerLayout was deprecated in the Support Library revision 24.0.0 and replaced with addDrawerListener(). The key difference is that setDrawerListener() only allowed a single listener (replacing any previously set one), while addDrawerListener() supports multiple listeners simultaneously. The migration is straightforward — replace the method call and update the removal pattern from implicit replacement to explicit removeDrawerListener().

The Deprecation

java
1// DEPRECATED — do not use
2DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
3drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
4    @Override
5    public void onDrawerSlide(View drawerView, float slideOffset) {}
6    @Override
7    public void onDrawerOpened(View drawerView) {}
8    @Override
9    public void onDrawerClosed(View drawerView) {}
10    @Override
11    public void onDrawerStateChanged(int newState) {}
12});

This compiles with a deprecation warning. In newer AndroidX versions, the method may be removed entirely.

The Fix: addDrawerListener()

java
1DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
2drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
3    @Override
4    public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
5        // Handle drawer sliding animation
6    }
7
8    @Override
9    public void onDrawerOpened(@NonNull View drawerView) {
10        // Drawer fully opened
11    }
12
13    @Override
14    public void onDrawerClosed(@NonNull View drawerView) {
15        // Drawer fully closed
16    }
17
18    @Override
19    public void onDrawerStateChanged(int newState) {
20        // STATE_IDLE, STATE_DRAGGING, or STATE_SETTLING
21    }
22});

addDrawerListener() appends to the list of listeners rather than replacing the existing one.

Using SimpleDrawerListener

If you only need a subset of callbacks, extend DrawerLayout.SimpleDrawerListener to avoid implementing empty methods:

java
1drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
2    @Override
3    public void onDrawerOpened(@NonNull View drawerView) {
4        Log.d("Drawer", "Opened");
5    }
6
7    @Override
8    public void onDrawerClosed(@NonNull View drawerView) {
9        Log.d("Drawer", "Closed");
10    }
11});

SimpleDrawerListener provides empty default implementations for all four callback methods.

Kotlin Implementation

kotlin
1val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
2
3drawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener {
4    override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
5        // Animate content based on slideOffset (0.0 to 1.0)
6    }
7
8    override fun onDrawerOpened(drawerView: View) {
9        // Invalidate options menu, update accessibility
10    }
11
12    override fun onDrawerClosed(drawerView: View) {
13        // Restore options menu
14    }
15
16    override fun onDrawerStateChanged(newState: Int) {
17        // Log state changes
18    }
19})

Multiple Listeners

The main advantage of addDrawerListener() is supporting multiple independent listeners:

java
1// Analytics listener
2drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
3    @Override
4    public void onDrawerOpened(@NonNull View drawerView) {
5        Analytics.logEvent("drawer_opened");
6    }
7});
8
9// UI update listener
10drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
11    @Override
12    public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
13        mainContent.setAlpha(1 - slideOffset * 0.5f);
14    }
15});

With setDrawerListener(), the second call would have replaced the first listener. With addDrawerListener(), both listeners coexist.

Removing Listeners

java
1DrawerLayout.DrawerListener myListener = new DrawerLayout.SimpleDrawerListener() {
2    @Override
3    public void onDrawerClosed(@NonNull View drawerView) {
4        // One-time action
5    }
6};
7
8drawerLayout.addDrawerListener(myListener);
9
10// Later, remove it explicitly
11drawerLayout.removeDrawerListener(myListener);

Store a reference to the listener if you need to remove it later. Anonymous listeners cannot be removed individually.

Using with ActionBarDrawerToggle

ActionBarDrawerToggle itself implements DrawerListener, so add it using the same API:

java
1ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
2    this, drawerLayout, toolbar,
3    R.string.navigation_drawer_open,
4    R.string.navigation_drawer_close
5);
6drawerLayout.addDrawerListener(toggle);
7toggle.syncState();

Common Pitfalls

  • Replacing setDrawerListener with addDrawerListener without removing old listeners: addDrawerListener does not replace existing listeners. If your code relied on setDrawerListener implicitly removing the previous listener, you may end up with duplicate listeners. Call removeDrawerListener() before adding new ones if replacement behavior is needed.
  • Using anonymous listeners and trying to remove them: Anonymous inner class instances cannot be removed because you have no reference to pass to removeDrawerListener(). Store the listener in a variable if removal is needed.
  • Forgetting to call toggle.syncState() with ActionBarDrawerToggle: After adding ActionBarDrawerToggle as a drawer listener, you must call syncState() to synchronize the hamburger icon state with the drawer position. Without it, the icon does not animate.
  • Leaking Activity references in listeners: Drawer listeners that hold strong references to the Activity can prevent garbage collection if the listener outlives the Activity. Remove listeners in onDestroy() or use weak references.
  • Using the deprecated Support Library instead of AndroidX: android.support.v4.widget.DrawerLayout is deprecated. Migrate to androidx.drawerlayout.widget.DrawerLayout which provides addDrawerListener() and ongoing support.

Summary

  • Replace setDrawerListener() with addDrawerListener() — the only required change
  • addDrawerListener() supports multiple simultaneous listeners; setDrawerListener() replaced the existing one
  • Use SimpleDrawerListener when you only need a subset of the four callbacks
  • Remove listeners with removeDrawerListener() — store references for listeners you need to remove later
  • Add ActionBarDrawerToggle with addDrawerListener() and call syncState() after
  • Migrate from the Support Library to AndroidX for continued updates and compatibility

Course illustration
Course illustration

All Rights Reserved.