我有以下代码:
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.:(快乐的编码。