Xamarin, C#, ALertDialog and 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(或替代方案(吗。

我只需要找到"后退"键。

谨致问候,Jim

这是因为,对话框首先需要按下后退按钮。按此键可取消对话框。再次按下后退按钮将调用您的重载方法。

假设如果用户取消对话框,您想关闭活动。如果是这样,就对它做出反应:

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();
    }
}
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.:(快乐的编码。

相关内容

  • 没有找到相关文章

最新更新