我在活动中有两个片段.当片段A显示时,我希望显示导航抽屉汉堡图标并使导航抽屉工作.当片段B显示时,我想要显示后退箭头以及何时单击它进行向上导航.但是,我似乎无法使用新的AppCompat v7工具栏在ActionBarActivity中显示向上箭头,除非导航抽屉打开.
在我的活动中,对于我的onCreate()方法,我有……@H_403_3@
toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);
然后我调用mDrawerToggle.syncState();在我的onPostCreate()中@H_403_3@
我试过搜索如何以编程方式触发工具栏图标到后箭头,但没有任何工作.从我收集到的,打电话@H_403_3@
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);
从我的片段应该改变图标,但事实并非如此.这可能是一个愚蠢的问题,但我做错了什么?@H_403_3@
解决方法
根据我在v7 ActionBarDrawerToggle的源代码中看到的内容,您可以将图标设置为不同的状态,而无需打开抽屉.
private enum ActionDrawableState{ BURGER,ARROW } private static void toggleActionBarIcon(ActionDrawableState state,final ActionBarDrawerToggle toggle,boolean animate){ if(animate) { float start = state == ActionDrawableState.BURGER ? 0f : 1.0f; float end = Math.abs(start - 1); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start,end); offsetAnimator.setDuration(300); offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float offset = (Float) animation.getAnimatedValue(); toggle.onDrawerSlide(null,offset); } }); offsetAnimator.start(); }else{ //do the same with nine-old-androids lib :) } }else{ if(state == ActionDrawableState.BURGER){ toggle.onDrawerClosed(null); }else{ toggle.onDrawerOpened(null); } } }
Burger和Arrow之间的变形取决于0f和1.0f之间的值,基本上这些是抽屉传递给ActionBarDrawerToggle的值.@H_403_3@
我使用ValueAnimator为此范围内的值设置动画,即模仿抽屉切换.@H_403_3@
null参数是安全的,因为ActionBarDrawerToggle根本不关心抽屉视图.
确保您看一下新的插补器,完全按照材料设计指南进行动画制作:@H_403_3@
fast_out_linear_in fast_out_slow_in
另一种方法是通过反射访问ActionBarDrawer的mSlider私有字段并调用setPosition(float position)方法在Burger和Arrow之间切换.
mSlider是类型(扩展)DrawerArrowDrawable.@H_403_3@