Android 工具栏设置NavigationOnClickListener中断了ActionbarDrawerToggle功能
我把动作栏换成了工具栏,我几乎把拼图的每一部分都准备好了。我的问题是,如果我“向上”导航并恢复导航抽屉,抽屉切换按钮将不再工作。我发现如果我将抽屉模式设置为unlocked(解锁),我可以滑动打开抽屉,但不能单击打开抽屉 所以我加载片段A,抽屉行为正常,转到片段B并应用向上图标,点击向上返回到A,抽屉将不再通过单击打开 进入片段B:Android 工具栏设置NavigationOnClickListener中断了ActionbarDrawerToggle功能,android,android-toolbar,android-navigation,Android,Android Toolbar,Android Navigation,我把动作栏换成了工具栏,我几乎把拼图的每一部分都准备好了。我的问题是,如果我“向上”导航并恢复导航抽屉,抽屉切换按钮将不再工作。我发现如果我将抽屉模式设置为unlocked(解锁),我可以滑动打开抽屉,但不能单击打开抽屉 所以我加载片段A,抽屉行为正常,转到片段B并应用向上图标,点击向上返回到A,抽屉将不再通过单击打开 进入片段B: Toolbar t = mHostingActivity.getToolbar(); mHostingActivity.getDrawerToggl
Toolbar t = mHostingActivity.getToolbar();
mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false);
mHostingActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
t.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStackToTop(mHostingActivity);
}
});
/**
* Pop the back stack and hide the Up caret all the way to the top level of the {@link com.loylap.activities.MainActivity}
*
* @param activity our hosting activity
*/
public static void popBackStackToTop(MainActivity activity) {
if (activity != null) {
FragmentManager fm = activity.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
activity.getDrawerToggle().setDrawerIndicatorEnabled(true);
}
}
导航抽屉的设置与示例一样,可能问题在于设置选项的旧方法?例如,我的活动中仍有以下内容:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
编辑:
好的,我已经将问题缩小到setNavigationOnClickListener()。如果我没有设置此选项(并通过“后退”按钮向上),抽屉将正常工作。所以现在的问题是,我如何正确地允许用户“向上”,并在我们向上之后恢复单击侦听器?我认为您不能使用:
t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
t.setNavigationOnClickListener(new View.OnClickListener() ...
因为这会破坏你正常的导航行为
相反,请在OnCreateOptions菜单(菜单菜单,菜单充气机)中尝试以下操作:
然后在OnOptions ItemSelected中
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
popBackStackToTop(mHostingActivity);
return true;
default:
break;
}
return false;
}
注意:不要忘记使用SetHasOptions菜单(true);在您的片段onCreateView中。因此我发现我创建了错误的单击侦听器。我需要的不是setNavigationOnClickListener(),而是:) 一个微妙但重要的变化,现在工具栏与v7 ActionBarDrawerToggle协同工作
/**
* Create the Up caret for a lower level fragment {@link com.loylap.activities.MainActivity}
*
* @param activity our hosting activity
*/
public static void createUpButton(final MainActivity activity)
{
ActionBarDrawerToggle toggle = activity.getDrawerToggle();
//Disables onClick toggle listener (onClick)
toggle.setDrawerIndicatorEnabled(false);
toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStackToTop(activity);
}
});
Toolbar t = activity.getToolbar();
t.setNavigationIcon(activity.getV7DrawerToggleDelegate().getThemeUpIndicator());
activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
灵感来自丹尼尔·威尔逊(Daniel Wilson)的解决方案,但你只需做一次就可以了 在我的
NavigationDrawer
的setUp()
(或者您可以在初始化ActionBarDrawerToggle
实例的任何地方执行此操作),我编写以下代码:
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!mDrawerToggle.isDrawerIndicatorEnabled()) {
getActivity().onBackPressed();
}
}
});
现在,每次按下安卓.id.home且汉堡标志不显示时,都会调用父活动的
onBackPressed()
。在我的情况下,这是一个顺序问题,我需要首先设置工具栏,然后设置单击侦听器。按此顺序:
//works
setSupportActionBar(myToolbar);
myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDrawer(view);
}
});
与此相反:
//doesn't work
myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDrawer(view);
}
});
setSupportActionBar(myToolbar);
我们可以使用
ValueAnimator drawerAnimator = ValueAnimator.ofFloat(Constants.HAMBURGER, Constants.BACK);
drawerAnimator.addUpdateListener(drawerAnimationUpdateListener);
drawerAnimator.setDuration(Constants.DRAWER_ANIMATION_DURATION);
drawerAnimator.setInterpolator(new LinearInterpolator());
汉堡图标通过动作0,背面通过动作1
public void updateNavigationDrawer(int action) {
drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable();
if (action == Constants.BACK) {
actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable);
actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//onBackPress();
}
});
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED););
} else {
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
if (drawerArrowDrawable.getProgress() != action) {
if (action == Constants.BACK) {
drawerAnimator.start();
} else {
drawerAnimator.reverse();
}
}
}
嗨,大牛,谢谢你的投入,原来就是这样的。有几个这样的问题似乎提到了这样一个事实:如果你使用工具栏,R.id.home将不再被解雇,这是一个耻辱。我现在想,我需要删除对动作栏抽屉切换的任何引用,并在activityHi中使用导航单击侦听器触发抽屉打开,这很奇怪,因为在我的项目中,我使用的是工具栏,当我单击箭头图标时,安卓.R.id.home通常会被触发。但是我可以看到,你已经找到了另一个解决方案,所以也许下次我会受到启发:)我只是想给这个添加一个简短的说明,我注意到onOptionsItemSelected并不是在片段中激发的,但是对于活动来说似乎很好——可以进行标准的android.R.id.home检查。我刚刚把你的解决方案修改成了一个新的解决方案。
public void updateNavigationDrawer(int action) {
drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable();
if (action == Constants.BACK) {
actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable);
actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//onBackPress();
}
});
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED););
} else {
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
if (drawerArrowDrawable.getProgress() != action) {
if (action == Constants.BACK) {
drawerAnimator.start();
} else {
drawerAnimator.reverse();
}
}
}