Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ActionBarDrawerToggle-以编程方式将汉堡图标切换到背面图标_Android_Android Actionbar_Toolbar - Fatal编程技术网

Android ActionBarDrawerToggle-以编程方式将汉堡图标切换到背面图标

Android ActionBarDrawerToggle-以编程方式将汉堡图标切换到背面图标,android,android-actionbar,toolbar,Android,Android Actionbar,Toolbar,如何以编程方式在汉堡图标和背面图标之间切换 使用下面的代码,我可以将汉堡包图标更改为背面,但我希望将其更改为动画 actionBarDrawerToggle.setDrawerIndicatorEnabled(false); 谢谢我也有同样的问题。 我用这些代码以编程方式更改图标 public void createBackButton() { Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); setNotifCo

如何以编程方式在汉堡图标和背面图标之间切换

使用下面的代码,我可以将汉堡包图标更改为背面,但我希望将其更改为动画

actionBarDrawerToggle.setDrawerIndicatorEnabled(false);

谢谢

我也有同样的问题。 我用这些代码以编程方式更改图标

public void createBackButton()
{
    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setNotifCount();
    setSupportActionBar(mToolbar);
    mToolbar.setTitle("");
    count.setVisibility(View.GONE);

    mDrawerToggle.setDrawerIndicatorEnabled(false);
    getSupportActionBar().setHomeAsUpIndicator(getDrawerToggleDelegate().getThemeUpIndicator());
    mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}

public void setDefaultActionBar() {

    setSupportActionBar(mToolbar);
    count.setVisibility(View.VISIBLE);
    mToolbar.setTitle("");
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    mDrawerToggle.setDrawerIndicatorEnabled(true);
    mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mDrawerLayout.isDrawerOpen(mLvDrawerMenu)) {
                mDrawerLayout.closeDrawer(mLvDrawerMenu);
            } else {
                mDrawerLayout.openDrawer(mLvDrawerMenu);
            }
        }
    });
}

注意:我将此代码与AppCompatActivity和自定义工具栏一起使用

如果您希望对菜单/箭头动画进行更多控制,您可能希望直接使用,而不是使用ActionBarDrawerToggle类。这需要更多的工作,因为您必须创建自己的动画师,但它允许您独立于导航抽屉更改可绘制状态

编辑:这里有一个快速的MenuArrowDrawable类,它扩展了DrawerRowDrawable并添加了动画。您只需将其设置为ActionBar或工具栏图标,并在需要更改状态时调用animatedravable()

public class MenuArrowDrawable extends DrawerArrowDrawable {

    private final ValueAnimator mMenuToArrowAnimator;
    private final ValueAnimator mArrowToMenuAnimator;

    public MenuArrowDrawable(Context context) {
        super(context);

        ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                setPosition((float)animation.getAnimatedValue());
            }
        };

        mMenuToArrowAnimator = ValueAnimator.ofFloat(0f, 1f);
        mMenuToArrowAnimator.setDuration(250);
        mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);

        mArrowToMenuAnimator = ValueAnimator.ofFloat(1f, 0f);
        mArrowToMenuAnimator.setDuration(250);
        mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
    }

    public void setPosition(float position) {
        if (position >= 1f) {
            setVerticalMirror(true);
        } else if (position <= 0f) {
            setVerticalMirror(false);
        }
        setProgress(position);
    }

    public float getPosition() {
        return getProgress();
    }

    public void animateDrawable(boolean menuToArrow) {
        if (menuToArrow && getPosition() >= 1f) return;
        if (!menuToArrow && getPosition() <= 0f) return;

        ValueAnimator animator = menuToArrow? mMenuToArrowAnimator : mArrowToMenuAnimator;
        if (animator.isRunning()) animator.end();
        animator.start();
    }
}
public类MenuArrowDrawable扩展了drawerRowDrawable{
私人最终估价动画师MMENUTOARROW动画师;
私人最终价值动画师Marrowtomananimator;
公共菜单可绘制(上下文){
超级(上下文);
ValueAnimator.AnimatorUpdateListener AnimatorUpdateListener=新的ValueAnimator.AnimatorUpdateListener(){
@凌驾
动画更新上的公共无效(ValueAnimator动画){
setPosition((float)animation.getAnimatedValue());
}
};
mMenuToArrowAnimator=ValueAnimator.offload(0f,1f);
mMenuToArrowAnimator.setDuration(250);
mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);
mArrowToMenuAnimator=值animator.offload(1f,0f);
mArrowToMenuAnimator.设定持续时间(250);
mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
}
公共无效设置位置(浮动位置){
如果(位置>=1f){
setVerticalMirror(真);
}否则,如果(位置=1f)返回;

如果(!menuToArrow&&getPosition()感谢@Brucelet的帮助,但需要一次编辑,则最终代码为:

public class MainActivity extends AppCompatActivity {
    @Bind(R.id.toolbar) public Toolbar toolbar;
    @Bind(R.id.drawer_layout) public DrawerLayout drawerLayout;

    public ActionBarDrawerToggle actionBarDrawerToggle;
    private MenuArrowDrawable drawerArrowDrawable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        setSupportActionBar(this.toolbar);

        final ActionBar actionBar = getSupportActionBar();
        if(actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowHomeEnabled(true);
            actionBar.setDisplayUseLogoEnabled(false);
            actionBar.setHomeButtonEnabled(true);
            this.drawerArrowDrawable = new MenuArrowDrawable(new ContextThemeWrapper(this, R.style.AppTheme_AppBarOverlay), actionBar);
        }

        this.actionBarDrawerToggle = new ActionBarDrawerToggle(this, this.drawerLayout, 0, 0);
        this.drawerLayout.setDrawerListener(this.actionBarDrawerToggle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        this.actionBarDrawerToggle.syncState();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return this.actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }

    public void menuToBack() {
        this.drawerArrowDrawable.animateDrawable(true);
    }

    public void backToMenu() {
        this.drawerArrowDrawable.animateDrawable(false);
    }

    public class MenuArrowDrawable extends DrawerArrowDrawable {
        private final ValueAnimator mMenuToArrowAnimator;
        private final ValueAnimator mArrowToMenuAnimator;
        private ActionBar actionBar;

        public MenuArrowDrawable(Context context, final ActionBar actionBar) {
            super(context);
            this.actionBar = actionBar;

            ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    setPosition((float) animation.getAnimatedValue());
                    if(actionBar != null) {
                        actionBar.setHomeAsUpIndicator(MenuArrowDrawable.this);
                    }
                }
            };

            mMenuToArrowAnimator = ValueAnimator.ofFloat(0f, 1f);
            mMenuToArrowAnimator.setDuration(250);
            mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);

            mArrowToMenuAnimator = ValueAnimator.ofFloat(1f, 0f);
            mArrowToMenuAnimator.setDuration(250);
            mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
        }

        public void setPosition(float position) {
            if (position >= 1f) {
                setVerticalMirror(true);
            } else if (position <= 0f) {
                setVerticalMirror(false);
            }
            setProgress(position);
        }

        public float getPosition() {
            return getProgress();
        }

        public void animateDrawable(boolean menuToArrow) {
            if (menuToArrow && getPosition() >= 1f) return;
            if (!menuToArrow && getPosition() <= 0f) return;

            ValueAnimator animator = menuToArrow? mMenuToArrowAnimator : mArrowToMenuAnimator;
            if (animator.isRunning()) animator.end();
            animator.start();
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
@绑定(R.id.toolbar)公共工具栏;
@绑定(R.id.drawer_布局)公共抽屉布局抽屉布局;
公共行动bardrawertoggle行动bardrawertoggle;
私人菜单可拖动抽屉可拖动;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
把(这个)绑起来;
设置支持操作栏(此工具栏);
最终ActionBar ActionBar=getSupportActionBar();
if(actionBar!=null){
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(真);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(真);
this.drawerRowDrawable=新菜单RowDrawable(新的ContextThemeWrapper(this,R.style.AppTheme\u AppBarOverlay),actionBar);
}
this.actionBarDrawerToggle=新的actionBarDrawerToggle(this,this.drawerLayout,0,0);
this.drawerLayout.setDrawerListener(this.actionBarDrawerToggle);
}
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
this.actionBarDrawerToggle.syncState();
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
返回此.actionBarDrawerToggle.OnOptions项目Selected(项目)| | super.OnOptions项目Selected(项目);
}
public void menuToBack(){
此.drawerRowDrawable.animatedDrawable(true);
}
公共无效回卷功能表(){
此.drawerRowDrawable.animatedDrawable(false);
}
公共类MenuArrowDrawable扩展了DrawerRowDrawable{
私人最终估价动画师MMENUTOARROW动画师;
私人最终价值动画师Marrowtomananimator;
私人ActionBar ActionBar;
公共菜单RowDrawable(上下文上下文、最终操作栏操作栏){
超级(上下文);
this.actionBar=actionBar;
ValueAnimator.AnimatorUpdateListener AnimatorUpdateListener=新的ValueAnimator.AnimatorUpdateListener(){
@凌驾
动画更新上的公共无效(ValueAnimator动画){
setPosition((float)animation.getAnimatedValue());
if(actionBar!=null){
actionBar.setHomeAsUpIndicator(MenuArrowDrawable.this);
}
}
};
mMenuToArrowAnimator=ValueAnimator.offload(0f,1f);
mMenuToArrowAnimator.setDuration(250);
mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);
mArrowToMenuAnimator=值animator.offload(1f,0f);
mArrowToMenuAnimator.设定持续时间(250);
mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
}
公共无效设置位置(浮动位置){
如果(位置>=1f){
setVerticalMirror(真);
}否则,如果(位置=1f)返回;

如果(!menuToArrow&&getPosition()谢谢,但你能举一个例子来集成actionbar和切换图标吗?如何在这个方向上改变Arraw方向,如向左或向右谢谢,但我认为你错了。我想在不打开抽屉的情况下将汉堡包图标切换到背面图标,请查看gmail应用程序,并打开列表中的电子邮件,查看抽屉图标不确定为什么要调用
操作AnimatorUpdateListener中的Bar.setHomeAsUpIndicator()
。您只需在活动onCreate()中调用它。您也可能不需要继续使用ActionBarDrawerToggle进行任何操作。@Brucelet没有它,图标没有更新,菜单RowDrawable在每个状态下创建一个drawable,我必须在每个状态完成后更新actionbar drawable这是因为您离开了<