如何从对话中最小化或关闭应用程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从对话中最小化或关闭应用程序?相关的知识,希望对你有一定的参考价值。

我是Xamarin和移动开发的新手,我有winforms和.net的经验,但是线程和MVVM并不是我非常熟悉的。

如果您单击后退,在对话框中选择确定,然后再次单击返回,我的代码将起作用。但我希望通过以下方式改进它:

  • 以编程方式调用后退按钮再次强制检查(带增量计数器)
  • 如果单击“确定”(首选),请直接关闭应用程序

下面的代码覆盖了android上的后退按钮,如果它返回true。注释掉的部分是我早些时候的饺子。

    /// <summary>
    /// Gives the user a warning that they are about to close the main page
    /// </summary>
    public override bool OnAndroidBackButtonPressed()
    {
        if (this.CloseAppAttempts == 0)
        {
            try
            {
                this.device.BeginInvokeOnMainThread(async () =>
                {
                    bool closeApp = await this.DisplayService.DisplayAlertAsync("Close app", "Click the OK button to close the app / or click the back button again to close the app", "Ok", "Cancel");
                    if (closeApp)
                    {
                        // this.DisplayService.CloseAsync();
                        // this.DisplayService.ExitAsync();
                        // this.DisplayService.pageStack.Pop();
                        // await IDisplayService.navigation.PopAsync();

                        this.CloseAppAttempts++;
                        // i would like to either call the backbutton programatically here, or close 
                    }
                });
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("===== Debug Message - Closing the app did not work -  [ " + ex.Message + " ]");
            }

            return true;
        }
        else
        {
            return false;
        }
    }
答案

Xamarin.Android

以下代码覆盖后退按钮并在返回之前警告用户:

public class MainActivity : Activity
{
    . . .

    bool pressed = false;

    public override void OnBackPressed()
    {
        if (!pressed)
        {
            Toast.Show("Press again to exit"); //Implement the Toast correctly
            pressed = true;
        }
        else
            base.OnBackPressed();
    }
}

(添加一些逻辑来重新装配这个Toast,所以如果用户在一段时间后按下按钮,它会再次显示)


下一个片段显示一条消息(我不知道如何在Xamarin.Android中显示消息,但逻辑是存在的)

public class MainActivity : Activity
{
    . . .

    public override void OnBackPressed()
    {
        if (Alert("Exit?", "Yes", "No"))
            base.OnBackPressed();
    }
}

Xamarin.Forms

在Xamarin.Forms上,您需要知道正在显示的页面,因此您不会在每个页面和子页面上显示该对话框。

在这种情况下,我使用NavigationPage来控制所有页面。

public class MainActivity : global::Xamarin.Forms.P . . .
{
    . . .

    bool pressed = false;

    public override void OnBackPressed()
    {
        if (Xamarin.Forms.Application.Current.MainPage.Navigation.NavigationStack.Count == 1)
        {
            if (Xamarin.Forms.Application.Current.MainPage.Navigation.NavigationStack[0].DisplayAlert(
                "Confirm exit",
                "Do you really want to exit?",
                "Yes", "No"))
                base.OnBackPressed();
        }
        else
            base.OnBackPressed();
    }
}
另一答案

您可以使用以下命令关闭android上的应用程序:

public void CloseApplication()
{
    var activity = (Activity)Forms.Context;
    activity.FinishAffinity();
}

使用Xamarin.Forms,您可以通过依赖服务调用它。

以上是关于如何从对话中最小化或关闭应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在片段活动中显示自定义对话框

关闭从另一个对话框片段启动的对话框片段会导致非法状态异常

如何从另一个活动或底部工作表对话框/片段中关闭一个活动

在MFC生产的基本对话框界面中,只有关闭按钮,没有最大最小化按钮,如何给它添加一个最小化按钮?

如何在 BottomSheetDialogFragment 顶部显示另一个片段

日期选择器对话框在片段中不起作用[关闭]