Xamarin,C#,ALertDialog和OnBackPressed

时间:2016-09-09 22:56:27

标签: xamarin xamarin.android alertdialog onbackpressed

我有以下代码:

using Android.App;
using Android.OS;
using Android.Util;
using Android.Views;

namespace TestIt {
    [Activity( Label = "TestIt", MainLauncher = true, Icon = "@drawable/icon", Theme = "@android:style/Theme.Dialog" )]
    public class TestIt:Activity {

        public static readonly string progName = "TestIt";

        public static AlertDialog builder = null;

        protected override void OnCreate(Bundle bundle) {

            base.OnCreate(bundle);

            Log.Debug(progName, "OnCreate entered");

            builder = (new AlertDialog.Builder( this )).Create();

            Log.Debug(progName, "Build Alert");

            builder.Window.SetType(WindowManagerTypes.SystemAlert);
            builder.SetCancelable(true);
            builder.SetTitle("Test");
            builder.SetMessage("This is a test message");
            builder.Show();

            Log.Debug(progName, "Build Alert Ending"); 

        }

        public override void OnBackPressed() {
            Log.Debug(progName, "OnBackPressed Entered");

            if(builder != null) {
                builder.Cancel();
            }

            base.OnBackPressed();
            Finish();
        }
    }
}

一切正常,并显示警报。

但按下后退键时未输入OnBackPressed。

相反,我在LogCat中收到消息:

  

尝试完成输入事件但输入事件接收器已经处理完毕。

我已经看过几个Java和几个Xamarin尝试解决这个问题,但这个技术通常深藏在样本的功能中。

有人可以提供一些关于如何调整此代码的C#(Xamarin)洞察,以便输入OnBackPressed(或替代方案)。

我只需要触及Back键。

此致 吉姆

2 个答案:

答案 0 :(得分:1)

这是因为,对话框首先消耗后退按钮。此按下取消对话框。按下另一个按钮将调用重载方法。

如果用户取消对话框,我假设您要关闭活动。如果是这样,只需对此做出反应:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    // ...

    // attach the event listener
    builder.CancelEvent += OnDialogCancel;
    builder.Show();
}

private void OnDialogCancel(object sender, EventArgs eventArgs)
{
    builder.CancelEvent -= OnDialogCancel;
    Finish();
}

如果您确实需要按下“后退”按钮,则在显示对话框时,您必须继承自己的对话框并覆盖OnBackPressed

public class MainActivity : Activity
{
    // ...
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // ...
        builder = new MyAlertDialog(this);

        Log.Debug(progName, "Build Alert");
        builder.SetCancelable(true);
        builder.SetTitle("Test");
        builder.SetMessage("This is a test message");
        builder.Show();

        Log.Debug(progName, "Build Alert Ending");
    }
}

public class MyAlertDialog : AlertDialog
{
    public MyAlertDialog(Context context) : base(context)
    {
    }

    public override void OnBackPressed()
    {
        Log.Debug("foo", "OnBackPressed Entered");
        base.OnBackPressed();
    }
}

答案 1 :(得分:0)

public override void OnBackPressed()
    {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.SetTitle("msgConfirm");
        alert.SetMessage("msgSureExit");
        alert.SetPositiveButton("msgYes"), (sender, args) =>
        {
            this.FinishAffinity();
        });
        alert.SetNegativeButton("msgNo"), (sender, args) =>
        {

        });
        Dialog dialog = alert.Create();
        dialog.Show();
    }
  

这是更简单的方法。这可以帮助某人。如果这很有用,那么回复@ user1047857。 :)快乐的编码。