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

前端之家收集整理的这篇文章主要介绍了android – AppCompat v7工具栏向上/向后箭头不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在活动中有两个片段.当片段A显示时,我希望显示导航抽屉汉堡图标并使导航抽屉工作.当片段B显示时,我想要显示后退箭头以及何时单击它进行向上导航.但是,我似乎无法使用新的AppCompat v7工具栏在ActionBarActivity中显示向上箭头,除非导航抽屉打开.

在我的活动中,对于我的onCreate()方法,我有……

  1. toolbar = (Toolbar) findViewById(R.id.toolbar);
  2. if (toolbar != null) {
  3. setSupportActionBar(toolbar);
  4. }
  5. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
  6. mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close);
  7. mDrawerLayout.setDrawerListener(mDrawerToggle);
  8. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  9. getSupportActionBar().setHomeButtonEnabled(true);

然后我调用mDrawerToggle.syncState();在我的onPostCreate()中

我试过搜索如何以编程方式触发工具栏图标到后箭头,但没有任何工作.从我收集到的,打电话

  1. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  2. getSupportActionBar().setDisplayShowHomeEnabled(true);
  3. getSupportActionBar().setHomeButtonEnabled(true);

从我的片段应该改变图标,但事实并非如此.这可能是一个愚蠢的问题,但我做错了什么?

解决方法

根据我在v7 ActionBarDrawerToggle的源代码中看到的内容,您可以将图标设置为不同的状态,而无需打开抽屉.
  1. private enum ActionDrawableState{
  2. BURGER,ARROW
  3. }
  4. private static void toggleActionBarIcon(ActionDrawableState state,final ActionBarDrawerToggle toggle,boolean animate){
  5. if(animate) {
  6. float start = state == ActionDrawableState.BURGER ? 0f : 1.0f;
  7. float end = Math.abs(start - 1);
  8. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  9. ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start,end);
  10. offsetAnimator.setDuration(300);
  11. offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
  12. offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  13. @Override
  14. public void onAnimationUpdate(ValueAnimator animation) {
  15. float offset = (Float) animation.getAnimatedValue();
  16. toggle.onDrawerSlide(null,offset);
  17. }
  18. });
  19. offsetAnimator.start();
  20. }else{
  21. //do the same with nine-old-androids lib :)
  22. }
  23. }else{
  24. if(state == ActionDrawableState.BURGER){
  25. toggle.onDrawerClosed(null);
  26. }else{
  27. toggle.onDrawerOpened(null);
  28. }
  29. }
  30. }

Burger和Arrow之间的变形取决于0f和1.0f之间的值,基本上这些是抽屉传递给ActionBarDrawerToggle的值.

我使用ValueAnimator为此范围内的值设置动画,即模仿抽屉切换.

null参数是安全的,因为ActionBarDrawerToggle根本不关心抽屉视图.
确保您看一下新的插补器,完全按照材料设计指南进行动画制作:

  1. fast_out_linear_in
  2. fast_out_slow_in

另一种方法是通过反射访问ActionBarDrawer的mSlider私有字段并调用setPosition(float position)方法在Burger和Arrow之间切换.
mSlider是类型(扩展)DrawerArrowDrawable.

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

猜你在找的Android相关文章