2013-12-22 2 views
0

Итак, я пытаюсь получить AlertDialog, чтобы подтвердить щелчок по кнопке «удалить из базы данных». Пробовал довольно долго и не мог получить рабочую модель. Мой текущий код выглядит следующим образом.Подтверждение удаления с помощью AlertDialog в Android

В верхней части класса булево

private static boolean dialogResult; 

Способ для отображения диалогов

private void showErrorDialog(String title, String message){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this) 
    .setTitle(title) 
     .setMessage(message) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Activity.setDialogResult(true); 
       dialog.dismiss(); 
       } 
      }) 
     .setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Activity.setDialogResult(false); 
       dialog.dismiss(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 

, где setDialogResult (BOOL) просто устанавливает переменную вышеупомянутого класса.

когда кнопка 'Удалить' нажимается этот код выполняет:

setDialogResult(false); 
//Find which list is to be deleted 
     RadioButton selectedBtn=(RadioButton)findViewById(group.getCheckedRadioButtonId()); 
     String currentSelectedListName=selectedBtn.getText().toString(); 

      if(!currentSelectedListName.equals("All")){//check if the list is the default 
       showErrorDialog("","Delete: "+currentSelectedListName+" ?"); 
       if(dialogResult){ 
        mDbHelper.deleteFGList(currentSelectedListName); 
        this.populateRadioGroupFromDb(); 
       } 
      } else{//if it is the default (That is, the name of the list is "All") tell user of error 
       showErrorDialog("Delete Error","The default list cannot be deleted"); 
      } 
     //} 

Цените помощь!

Редактировать: извините, забыли упомянуть об ошибке, которую я имел. Когда вы нажмете OK в диалоговом окне предупреждения, он не удалит элемент из базы данных. Как-то он пропускает эту логическую проверку. Вы можете увидеть, что значение boolean для параметра false указано в начале этого фрагмента кода. Если он удален, вы нажимаете кнопку «удалить», кнопку ok в диалоговом окне, а затем ничего не происходит. Если вы снова нажмете кнопку «удалить», этот новый выбор будет удален автоматически без проверки диалога. В основном, те методы onClick испорчены, и я надеялся, что есть лучший способ сделать это. Я читал что-то об использовании интерфейсов?

Так кажется, что люди были предположить, этот подход

if(!currentSelectedListName.equals("All")){//check if the list is the default 
       AlertDialog.Builder builder = new AlertDialog.Builder(this) 
       .setTitle("") 
        .setMessage("Delete: "+currentSelectedListName+" ?") 
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
           mDbHelper.deleteFGList(currentSelectedListName); 
           Activity.populateRadioGroupFromDb(); 
          } 
        }) 
        .setNegativeButton(R.string.cancel,null); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
      } else{//if it is the default (That is, the name of the list is "All") tell user of error 
       showErrorDialog("Delete Error","The default list cannot be deleted"); 
      } 

Проблема заключается в том, что затмение дает ошибку компиляции на

mDbHelper.deleteFGList(currentSelectedListName); 
Activity.populateRadioGroupFromDb(); 

1.Cannot относится к неконечной переменной currentSelectedListName внутри внутреннего класса определенный в другом методе 2. Невозможно сделать статическую ссылку на нестатический метод populateRadioGroupFromDb() из типа MyFGCardsActivity

Является ли это защищенным подходом или я не понимаю?

+0

Какая ошибка? –

+0

С какими проблемами вы сталкиваетесь? отображается диалоговое окно? – Chandrashekhar

ответ

0

Вызывайте эту две строки в setPositiveButton

mDbHelper.deleteFGList(currentSelectedListName); 
this.populateRadioGroupFromDb(); 

Благодаря

+0

К сожалению, метод OnClick в setPositiveButton считается в другом классе, поэтому currentSelectedListName не передается и ActivityClass.populateRadioGroupFromDb(); не работает из-за статических, нестатических проблем. Пробовал это уже – ReluctantTurtle

1

Android Диалоги не модальный дизайном. То есть они не будут блокировать выполнение вашего кода до отклонения, но show() вернется немедленно. Поэтому, когда вы пишете код, как это:

showErrorDialog("","Delete: "+currentSelectedListName+" ?"); 
if(dialogResult){ 

dialogResult пока не доступен.

Теперь вы упоминаете что-то о «интерфейсах», и это часть решения. Вы должны назначить обратные вызовы, например. к положительным и отрицательным кнопкам, которые делают то, что вы хотите. Эти обратные вызовы реализованы с точки зрения интерфейсов Java. На самом деле у вас уже есть такие интерфейсы обратного вызова: DialogInterface.OnClickListener.

Так что поставьте код, который должен работать на положительном клике в слушателе на положительной кнопке, например.код удаления и поместить любой код, который должен выполняться при отрицательном щелчке в соответствующем прослушителе, например. ничего. И избавиться от переменной dialogResult и, возможно, любых учебников, которые способствуют такому стилю кодирования (используя статические классы классов для информации о локальном состоянии).

Вызов dismiss() в прослушивателе onClick() является излишним: при назначении слушателей, как это, диалог будет уже уволен, когда ваш слушатель работает.

+0

Согласен, что метод dialogResult - это плохой подход, просто лучшее, что я мог найти. Я редактирую свой оригинальный пост, это то, что вы имели в виду? У меня нет большого опыта создания удобных интерфейсов, и теперь я действительно уверен, как я буду заниматься этим – ReluctantTurtle