android – AppCompat v7工具栏向上/向后箭头不起作用

我在活动中有两个片段.当片段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.

就个人而言,我总是尽量避免反思,只要没有其他方法可以做你的肮脏工作.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...