工具栏setNavigationOnClickListener打破了ActionbarDrawerTogglefunction

我正在交换工具栏的操作栏,而且我几乎已经拼出了每一个拼图。 我的问题是,如果我导航“上”,并恢复导航抽屉,抽屉切换button不再起作用。 我想如果我设置抽屉模式解锁我有能力轻扫打开抽屉,但不能点击打开抽屉。

所以我加载了片段A,抽屉行为正常,往下到片段B,应用上图标,点击返回到A,抽屉不会再点击打开。

input片段B:

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()。 如果我没有设置(并通过后退button) – 抽屉的行为是正确的。 所以现在的问题是我怎么才能正确地让用户去'上',并恢复点击监听器后,我们去了吗?

所以我想通了,我正在创build一个错误的点击监听器。 而不是setNavigationOnClickListener(),我需要setToolbarNavigationClickListener() 🙂

一个微妙而重要的变化,现在的工具栏是与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); } 

在我的情况下,这是一个顺序问题,我需要先设置工具栏,然后设置点击监听器。 按此顺序:

  //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); 

受到丹尼尔·威尔逊的解决scheme的启发,但你只需要做一次,一切就绪。

在我的NavigationDrawersetUp() (或者你可以在你初始化你的ActionBarDrawerToggle实例的任何地方),我写这个代码:

 mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!mDrawerToggle.isDrawerIndicatorEnabled()) { getActivity().onBackPressed(); } } }); 

现在,每次按下android.id.home并且不显示汉堡符号时,都会调用父活动的onBackPressed()

我认为你不能使用:

  t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator()); t.setNavigationOnClickListener(new View.OnClickListener() ... 

因为它会打破你正常的导航抽屉行为。

而是在onCreateOptionsMenu(Menu Menu,MenuInflater inflater)中尝试如下所示:

 mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false); mHostingActivity.getDrawerToggle().setHomeAsUpIndicator(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator()); 

然后在onOptionsItemSelected中

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: popBackStackToTop(mHostingActivity); return true; default: break; } return false; } 

PS:不要忘记使用setHasOptionsMenu(true); 在你的片段onCreateView。

animation我们可以使用。

 ValueAnimator drawerAnimator = ValueAnimator.ofFloat(Constants.HAMBURGER, Constants.BACK); drawerAnimator.addUpdateListener(drawerAnimationUpdateListener); drawerAnimator.setDuration(Constants.DRAWER_ANIMATION_DURATION); drawerAnimator.setInterpolator(new LinearInterpolator()); 

HAMBURGER图标为0,BACK为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(); } } }