Android: как переопределить onBackPressed() в AlertDialog?
У меня есть AlertDialog dlgDetails
который показан из другого AlertDialog dlgMenu
, Я хотел бы иметь возможность снова показывать dlgMenu, если пользователь нажимает кнопку возврата в dlgDetails, и просто выходить из диалогового окна, если он нажимает вне диалогового окна.
Я думаю, что лучший способ сделать это - переопределить onBackPressed
для dlgDetails, но я не уверен, как это сделать, поскольку AlertDialogs должен создаваться косвенно с помощью Builder.
Я пытаюсь создать производный AlertDialog (public class AlertDialogDetails extends AlertDialog { ...}
) но тогда я думаю, что я должен также расширить AlertDialog.Builder
в этом классе, чтобы вернуть AlertDialogDetails, но нет ли более простого способа? А если нет, как бы вы переопределили Строителя?
5 ответов
Наконец, я добавил ключевой слушатель в свой диалог, чтобы прослушать клавишу Назад. Не так элегантно, как переопределение onBackPressed()
но это работает. Вот код:
dlgDetails = new AlertDialog.Builder(this)
.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK &&
event.getAction() == KeyEvent.ACTION_UP &&
!event.isCanceled()) {
dialog.cancel();
showDialog(DIALOG_MENU);
return true;
}
return false;
}
})
//(Rest of the .stuff ...)
Нашел более короткое решение:) попробуйте это:
accountDialog = builder.create();
accountDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
activity.finish();
}
});
Это обрабатывает как кнопку НАЗАД, так и щелчок ВНЕ диалогового окна:
yourBuilder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.cancel();
// do your stuff...
}
});
dialog.cancel()
это ключ: с dialog.dismiss()
это будет обрабатывать только щелчок за пределами диалога, как ответили выше.
Я создал новую функцию в классе java и вызвал эту функцию из метода onClick построителя диалогов.
public class Filename extends Activity(){
@Override
onCreate(){
//your stuff
//some button click launches Alertdialog
}
public void myCustomDialog(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
//other details for builder
alertDialogBuilder.setNegativeButton("BACK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialod.dismiss;
myCustomBack();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.setCanceledOnTouchOutside(true);
alertDialog.show();
}
public void myCustomBack(){
if(condition1){
super.onBackPressed();
}
if(condition 2){
//do stuff here
}
}
@Override
public void onBackPressed(){
//handle case here
if (condition A)
//Do this
else
//Do that
}
}
Вот фактическое решение для С#, основанное на ответе Pooks:
Во-первых, мы должны создать новый класс для обработки события:
private sealed class KeyListener : Java.Lang.Object, IDialogInterfaceOnKeyListener
{
private readonly Action _action;
public KeyListener(Action action)
{
_action = action;
}
public bool OnKey(IDialogInterface dialog, [GeneratedEnum] Android.Views.Keycode keyCode, KeyEvent e)
{
var isBack = keyCode == Android.Views.Keycode.Back
&& e.Action == KeyEventActions.Up
&& !e.IsCanceled;
if (isBack)
_action.Invoke();
return isBack;
}
}
И нам нужно действие для получения события:
private void OnBackPressed()
{
// ... do the stuff
}
Теперь мы можем настроить это событие:
var dlgDetails = new AlertDialog.Builder(this)
.SetOnKeyListener(new KeyListener(OnBackPressed))
// add further set ups
.Create();