抽屉切换按钮转换为片段导航

时间:2017-07-15 22:50:35

标签: android android-fragments xamarin xamarin.android material-design

我正在尝试使用与Gmail应用完全相同的片段来编写带有工具栏导航的应用:您有一个抽屉切换显示为“汉堡包”按钮,当您点击邮件时,汉堡包会转换到后退按钮,反之亦然。

截至目前,我已经能够实现非常接近我想要的东西,除了从汉堡到后箭头没有“动画”的切换按钮。

我所做的是在mainActivity中绑定BackStack的监听器:

SupportFragmentManager.AddOnBackStackChangedListener(this);

然后从Fragment A,我可以加载片段B将其添加到Back Stack:

ResultFragment fragment = new ResultFragment();
this.Activity.SupportFragmentManager.BeginTransaction()
   .Replace(Resource.Id.main_fragment, fragment)
   .AddToBackStack("results")
   .Commit();

在主活动中,监听器检查Backstack,如果不为空,则将汉堡包切换到后退按钮:

bool canGoBack = SupportFragmentManager.BackStackEntryCount > 0;
if (canGoBack)
{
      //Showing Back Button
      if (!_toolbarNavigationListererSet)
      {
         drawerToggle.DrawerIndicatorEnabled = false;
         SupportActionBar.SetDisplayHomeAsUpEnabled(true);

         BackHandler backHandler = new BackHandler(this);
         drawerToggle.ToolbarNavigationClickListener = backHandler;
         _toolbarNavigationListererSet = true;
      }

}
else
{
       //Show the hamburger
       SupportActionBar.SetDisplayHomeAsUpEnabled(false);
       drawerToggle.DrawerIndicatorEnabled = true;

       drawerToggle.ToolbarNavigationClickListener = null;
       _toolbarNavigationListererSet = false;
 }

drawerToggle.ToolbarNavigationClickListener更改后退按钮的行为以调用后退按钮按下事件,如:

Activity.OnBackPressed();

仅此而已。

据我所知,通过这样做,汉堡包被隐藏,后面的按钮被显示出来,反之亦然,所以我确信这就是我看不到动画的原因。

我错过了什么?谢谢你的帮助。

P.S。代码是用C#编写的,因为我使用的是Xamarin.Android,但Java代码和/或Android Native Code被广泛接受为建议。

1 个答案:

答案 0 :(得分:0)

按下后退按钮可以添加动画,如下所示:

ValueAnimator anim = ValueAnimator.OfFloat(0f, 1.0f);
anim.AddUpdateListener(new AnimatorUpdateListener(this));
anim.SetInterpolator(new DecelerateInterpolator());
anim.SetDuration(500);
anim.Start();

public class AnimatorUpdateListener : Java.Lang.Object, ValueAnimator.IAnimatorUpdateListener
{
     private MainActivity mContext;

     public AnimatorUpdateListener(MainActivity context)
     {
         mContext = context;
     }

     public void OnAnimationUpdate(ValueAnimator valueAnimator)
     {
         var slideOffset = (System.Single)valueAnimator.AnimatedValue;
         mContext.drawerToggle.OnDrawerSlide(mContext.drawerLayout, slideOffset);
     }
}