【问题标题】:Drawer Toggle button transitions with fragment navigation带有片段导航的抽屉切换按钮转换
【发布时间】:2017-07-15 22:50:35
【问题描述】:

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

到目前为止,我已经能够实现非常接近我想要的东西,除了切换按钮不是从汉堡包到后退箭头的“动画”。

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

SupportFragmentManager.AddOnBackStackChangedListener(this);

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

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

在 Main Activity 中,Listener 检查 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();

仅此而已。

我知道这样做会隐藏汉堡包并显示后退按钮,反之亦然,所以我确定这就是我看不到动画的原因。

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

附:代码是用 C# 编写的,因为我使用的是 Xamarin.Android,但 Java 代码和/或 Android 本机代码被广泛接受作为建议。

【问题讨论】:

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


    【解决方案1】:

    您可以在按下返回按钮时添加动画,如下所示:

    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);
         }
    }
    

    【讨论】:

    • 谢谢!这从后退按钮到汉堡包效果很好(必须从 OfFloat(0f, 1.0f) 更改为 OfFloat(1.0f, 0f)),但从汉堡包到后退按钮不起作用。更准确地说,只有在设置drawerToggle.DrawerIndicatorEnabled = false;之前我awayt Task.Delay(500)才有效
    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多