2016-09-09 3 views
0

У меня есть следующий код:Xamarin, C#, 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 (или альтернативный вариант).

Мне просто нужно добраться до клавиши «Назад».

С уважением, Джим

ответ

1

Это потому, что диалог потребляет кнопку назад пресса, первый. Это сообщение отменяет диалог. Еще одно нажатие кнопки «Назад» вызовет ваш перегруженный метод.

I Предположим, что вы хотите закрыть действие, если пользователь отменяет диалог. Если это так, просто реагировать на него:

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(); 
    } 
} 
+0

Это решение сделало именно то, что я хотел. Я все еще получаю сообщение, но OnBackPressed введен, и я могу делать то, что мне нужно. Большое спасибо. – user1047857

+0

@ user1047857 если это ответит на ваш вопрос, примите ответ. Вопрос не должен оставаться в списке без ответа. http://meta.stackexchange.com/a/5235/324631 –

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(); 
    } 

Это более простой way.hope это помогает someone.If это полезно тогда ответ @ user1047857. :) счастливое кодирование.

Смежные вопросы