我在导航抽屉的打开和关闭过程中使用DrawerArrowDrawable
来设置汉堡包图标的动画。以下是我用于此的代码段:
DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this);
toolbar.setNavigationIcon(drawerArrow)
mDrawerToggle.syncState();
现在,当我打开片段时,我使用actionBar.setHomeAsUpIndicator(R.drawable.back_icon);
&在该片段中actionBar.setDisplayHomeAsUpEnabled(true);
,将导航图标更改为后退图标。图标发生变化,但该按钮的功能保持不变,即打开导航抽屉,但我想回到上一个片段(使用popBackStack
)。
我试图覆盖onOptionsItemSelected
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
break;
}
}
但是当我按导航图标时,控件永远不会进入上面的区块。
如果我知道如何拦截DrawerArrowDrawable的点击事件?我可以运行popBackStack
并做我想做的事。
答案 0 :(得分:0)
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
}
});
答案 1 :(得分:0)
在导航抽屉活动中添加此侦听器:
private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
setActionBarArrowDependingOnFragmentsBackStack();
}
};
然后创建此方法:
public void setActionBarArrowDependingOnFragmentsBackStack() {
int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
现在覆盖这些方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.isDrawerIndicatorEnabled() && mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == android.R.id.home && getFragmentManager().popBackStackImmediate()) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public void onDestroy() {
super.onDestroy();
getFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
}
最后在onCreate()方法中添加这一行:
getFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);