我在活动中有两个片段.当片段A显示时,我希望显示导航抽屉汉堡图标并使导航抽屉工作.当片段B显示时,我想要显示后退箭头以及何时单击它进行向上导航.但是,我似乎无法使用新的AppCompat v7工具栏在ActionBarActivity中显示向上箭头,除非导航抽屉打开.
在我的活动中,对于我的onCreate()方法,我有……
- 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()中
我试过搜索如何以编程方式触发工具栏图标到后箭头,但没有任何工作.从我收集到的,打电话
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- getSupportActionBar().setDisplayShowHomeEnabled(true);
- getSupportActionBar().setHomeButtonEnabled(true);
从我的片段应该改变图标,但事实并非如此.这可能是一个愚蠢的问题,但我做错了什么?
解决方法
根据我在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的值.
我使用ValueAnimator为此范围内的值设置动画,即模仿抽屉切换.
null参数是安全的,因为ActionBarDrawerToggle根本不关心抽屉视图.
确保您看一下新的插补器,完全按照材料设计指南进行动画制作:
- fast_out_linear_in
- fast_out_slow_in
另一种方法是通过反射访问ActionBarDrawer的mSlider私有字段并调用setPosition(float position)方法在Burger和Arrow之间切换.
mSlider是类型(扩展)DrawerArrowDrawable.
就个人而言,我总是尽量避免反思,只要没有其他方法可以做你的肮脏工作.