【问题标题】:How to make Xamarin.Android app exit when back button clicked twice(confirm message between clicks included)?单击两次后退按钮时如何使 Xamarin.Android 应用程序退出(包括单击之间的确认消息)?
【发布时间】:2018-05-31 15:40:48
【问题描述】:

在我的 MainActivity 中,我像这样覆盖了 OnBackPressed() 方法

public override void OnBackPressed()
{
    Toast toast = Toast.MakeText(this, "Press again to exit", ToastLength.Short);
    toast.SetMargin(0,0.20f);
    toast.Show();
}

当用户在 MainActivity 并单击一次后退按钮时,屏幕上会出现消息“再次按下退出”,该消息会在几秒钟后消失。如果用户在屏幕上显示此消息时再次单击返回按钮,我希望应用程序退出,但是当消息消失并且用户单击返回按钮时,我希望消息再次出现。我在 Java 中看到了一些示例,但我发现很难将这些示例调整为在 Xamarin.Android 上工作。

【问题讨论】:

标签: android xamarin.android


【解决方案1】:

这段代码运行良好。

    long lastPress;

    public override void OnBackPressed()
    {
        // source https://stackoverflow.com/a/27124904/3814729
        long currentTime = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;

        // source https://stackoverflow.com/a/14006485/3814729
        if (currentTime - lastPress > 5000)
        {
            Toast.MakeText(this, "Press back again to exit", ToastLength.Long).Show();
            lastPress = currentTime;
        }
        else
        {
            base.OnBackPressed();
        }
    }

如果您想使用较短的吐司长度,请更改时间。

ToastLength.Long = 3500(毫秒)

ToastLength.Short = 2000(毫秒)

【讨论】:

  • 我在我的 xamarin 表单项目中使用了这个技巧,我覆盖了我的主页的 OnBackButtonPressed(),这个技巧效果很好:)
【解决方案2】:
Toast toast = Toast.MakeText(Application.Context, "Press again to exit", ToastLength.Short);
bool doubleBackToExitPressedOnce = false;
public override void OnBackPressed()
{
    if (doubleBackToExitPressedOnce)
    {
        toast.Cancel();
        base.OnBackPressed();
        return;
    }

    toast.SetMargin(0, 0.20f);
    toast.Show();

    this.doubleBackToExitPressedOnce = true;

    new Handler().PostDelayed(() =>
    {
        doubleBackToExitPressedOnce = false;
    }, 2000);

}

【讨论】:

    【解决方案3】:

    我建议的最可靠的方法是这样的:

    public static bool doubleBackToExitPressedOnce=true
    
    public override void OnBackPressed()
        {
            if (doubleBackToExitPressedOnce)
            {
                FinishAffinity();
            }
            Common.FragmentManager.doubleBackToExitPressedOnce = true;
            Toast.MakeText(this, Resources.GetString(Resource.String.back_click_on_home), ToastLength.Short).Show();
            new Handler().PostDelayed(new RunnableHelper(), 2000);
        }
    
     public class RunnableHelper : Java.Lang.Object, IRunnable
    
     {
        public void Run()
        {
          doubleBackToExitPressedOnce = false;
        }
     }
    

    【讨论】:

      【解决方案4】:

      感谢 Mohamed Krayem,它的工作很好,但我编辑了您的代码以检查此页面是否为 rootPage,因为 Toast 告诉用户单击 Back 按钮再次退出应用程序,它出现在所有页面中而不是 rootPage只是,所以我在代码中添加了一些行来做到这一点,它对我很有用。

      顺便说一下,我在选项卡式项目(Shell 应用程序)中使用此代码。

          long lastPress;
          public override void OnBackPressed()
          {
              // Check the NavigationStack count if its equal 1 this means that it is on the rootPage
              int NavStackCount = App.Current.MainPage.Navigation.NavigationStack.Count;
              if (NavStackCount == 1)
              {
                  long currentTime = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;
      
                  if (currentTime - lastPress > 5000)
                  {
                      Toast.MakeText(this, "Press back again to exit", ToastLength.Long).Show();
                      lastPress = currentTime;
                  }
                  else
                  {
                      base.OnBackPressed();
                  }
              }
              else
              {
                  base.OnBackPressed();
              }
              
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多