Потвърждаване на изтриване чрез AlertDialog в Android

Така че се опитвам да накарам AlertDialog да потвърди щракване върху бутон „изтриване от базата данни“. Опитвам от доста време и не мога да намеря работещ модел. Текущият ми код е както следва.

В горната част на класа булев

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 в началото на този кодов фрагмент. Ако се изтрие, натиснете бутона „изтриване“, бутона „ОК“ в диалоговия прозорец и след това нищо не се случва. Ако натиснете отново бутона „изтриване“, този нов избор ще бъде изтрит автоматично без проверка на диалоговия прозорец. По принцип тези методи 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");
            }

Проблемът е, че eclipse дава грешки при компилиране

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

1. Не може да препраща към не-крайна променлива currentSelectedListName във вътрешен клас, дефиниран в различен метод 2. Не може да прави статична препратка към нестатичния метод populateRadioGroupFromDb() от типа MyFGCardsActivity

Това ли е препоръчваният подход или аз не разбирам?


person ReluctantTurtle    schedule 22.12.2013    source източник
comment
Какъв проблем имаш? показан ли е диалоговият прозорец?   -  person Chandrashekhar    schedule 22.12.2013


Отговори (2)


Диалоговите прозорци на Android не са модални по дизайн. Тоест, те няма да блокират изпълнението на вашия код, докато не бъдат отхвърлени, но show() ще се върне незабавно. Следователно, когато пишете код по този начин:

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

dialogResult все още не е наличен.

Сега споменавате нещо за "интерфейси" и това е част от решението. Трябва да зададете обратни извиквания, напр. до положителни и отрицателни бутони, които правят това, което искате. Тези обратни извиквания се изпълняват от гледна точка на Java интерфейси. Всъщност вече имате такива интерфейси за обратно извикване: DialogInterface.OnClickListener.

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

Извикването на dismiss() в слушателя onClick() тук е излишно: когато присвоите слушателите по този начин, диалоговият прозорец вече ще бъде отхвърлен, когато вашият слушател се изпълнява.

person laalto    schedule 22.12.2013
comment
Съгласен съм, че методът dialogResult е лош подход, просто най-добрият, който можах да намеря. Редактирам оригиналния си пост, това ли имахте предвид? Нямам много опит в създаването на използваеми интерфейси, така че сега наистина съм сигурен как бих го направил - person ReluctantTurtle; 22.12.2013

Обадете се на тези два реда в setPositiveButton

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

Благодаря

person Md Abdul Gafur    schedule 22.12.2013
comment
За съжаление методът OnClick в setPositiveButton се счита за в различен клас, така че currentSelectedListName не се предава и ActivityClass.populateRadioGroupFromDb(); не работи поради статични, нестатични проблеми. Опитах този вече - person ReluctantTurtle; 22.12.2013