DrawerLayout.setDrawerListener() 在 API 24+ **已棄用**,且若 Activity 實作 ActionBarDrawerToggle 並呼叫 syncState(),可能覆蓋自訂監聽器。
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, R.drawable.ic_menu, R.string.open, R.string.close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
Log.d("Drawer", "CLOSED");
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
Log.d("Drawer", "OPENED");
}
};
drawer.addDrawerListener(toggle); // 關鍵:使用 addDrawerListener
toggle.syncState(); // 同步三線圖標狀態
toggle.syncState() 導致圖標動畫、狀態不同步。ActionBarDrawerToggle 建構子需傳入 Toolbar(新版)而非 DrawerLayout 做錨點。DrawerLayout 監聽請使用 addDrawerListener 而非棄用的 setDrawerListener,並確保呼叫 toggle.syncState()。若仍不觸發,檢查 DrawerLayout 是否正確設置 android:fitsSystemWindows 及佈局層級。