我正在Toolbar
中实现带抽屉切换(带有汉堡箭头动画)的导航抽屉。直到这里一切顺利。现在,如果用户将内容切换到较低级别的片段,我想提供带有后退箭头的向上导航。事情变得棘手了。目前我的实现如下:
ActivityMain.java
setSupportActionBar(mToolbar);
mActionBarDrawerToggle = new ActionBarDrawerToggle(
this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
if(mDrawerFragment != null) {
mDrawerFragment.onDrawerClose();
}
}
public void onDrawerOpened(View drawerView) {
mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);
if(mDrawerFragment != null) {
mDrawerFragment.onDrawerOpen();
}
}
};
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
//Setze einen Custom-Clicklistener, der die Clicks auf den DrawerToggle handelt
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("debug", "onclick");
if(currentlyAttached instanceof GridViewFragment) {
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
}
else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
}
else {
onBackPressed();
}
}
});
getSupportActionBar().setDisplayShowTitleEnabled(false);
mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);
mActionBarDrawerToggle.syncState();
我为工具栏设置了NavigationClicklistener以捕获点击的触发器。可以看出,如果用户位于根片段(GridviewFragment)上,我只想打开导航抽屉。在其他情况下,我想提供向上导航。功能本身(打开/关闭抽屉和返回)运行良好,但抽屉切换有时会显示错误的图标。一个例子:
我不知道为什么会这样。也许有人有个主意?那真的很棒。我只是发布了一些额外的代码以便更好地理解。
styles.xml,我将颜色设置为白色
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
我有两个被调用的方法,当碎片发生变化时,我可以做一些事情来影响抽屉切换,但我不确定,这可能是最好的方法。
private void provideBackNavigation() {
mActionBarDrawerToggle.syncState();
}
private void provideMenuDrawerNavigation() {
mActionBarDrawerToggle.syncState();
}
提前感谢您的帮助。
答案 0 :(得分:1)
我在自己的应用程序中设置了类似的功能。我使用方法ActionBarDrawerToggle.setDrawerIndicatorEnabled
和[DrawerLayout.setDrawerLockMode
](https://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#setDrawerLockMode(int,int))完成了这项工作。
首先,我创建了以下方法:
public void setDrawerState(boolean isEnabled) {
if (isEnabled) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START);
} else {
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START);
}
mDrawerToggle.syncState();
}
此方法允许您锁定导航抽屉,从而无法打开要添加导航的片段。我将此方法放在我的Activity
中并将其调用到我的片段的所有的onResume
中,因此根据我希望锁定/解锁抽屉的片段进行相应设置
接下来,在我的Activity
中,我还有以下设置:
public boolean onOptionsItemSelected(final MenuItem item) {
if (mDrawerLayout.getDrawerLockMode(GravityCompat.START)
!= DrawerLayout.LOCK_MODE_LOCKED_CLOSED
&& mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
如果抽屉未锁定,则允许打开抽屉,但如果抽屉被锁定,则向上导航功能将接管。
最后,我的onBackPressed
中的Activity
方法被覆盖如下:
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START))
mDrawerLayout.closeDrawer(GravityCompat.START);
else
super.onBackPressed();
}
如果导航抽屉打开,它将关闭导航抽屉,否则继续默认向上导航。
我相信这就是我所设置的一切,所以请告诉我它是否适合你。