Android: използване на AlertDialog, когато елемент от изглед на списък е натиснат дълго

Имам списък с елементи, създаден от списък. Бих искал да натисна дълго един от елементите в списъка и да се отвори диалогов прозорец за предупреждение и в зависимост от клавиша да или не в този диалогов прозорец искам да задам глобална променлива. Кодът, който използвам, е в "MyActivity.java" и изглежда така:

ListView lv = getListView();
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> av, View v, int pos, final long id) {

        final AlertDialog.Builder b = new AlertDialog.Builder(MyActivity.this);
        b.setIcon(android.R.drawable.ic_dialog_alert);
        b.setMessage("Are you sure?");
        b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    yesOrNo = 1;
                }
        });
        b.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    yesOrNo = 0;
                }
        });

        b.show();

        if (yesOrNo == 1) {
            DO SOMETHING;   
        }
        return true;
    }
});

Обаче глобалната променлива "yesOrNo" не се променя, независимо дали натискам "Да" или "Не". Може ли някой да ми каже какво не е наред с кода?

Благодаря за помощта.


person TJ1    schedule 20.07.2011    source източник
comment
Поставете един Log.i(SOMETHING, ENVOKED); вътре във всеки слушател, за да видите дали се задейства при щракване върху бутона? Защо не използвате булеви стойности? :) Вярно за Да, Невярно за Не..по-евтино е.   -  person Nikola Despotoski    schedule 20.07.2011


Отговори (5)


AlertDialog не чака избора. След като извикате метод show(), тези два реда ще бъдат изпълнени незабавно:

if (yesOrNo == 1) {
        DO SOMETHING;   
}

Така че стойността на променливата yesOrNo ще бъде нейната първоначална стойност.

Решение:

Можете да извикате doSomething(0) в onClick() метод на positiveButton и doSomething(1) в onClick() метод на negativeButton.

person Onuray Sahin    schedule 20.07.2011
comment
Как тогава мога да постигна това, което искам? Благодаря за помощта. - person TJ1; 20.07.2011

yesOrNo се променя. Но не можахте да го хванете. Тъй като AlertDialog е асинхронен, той не чака щракването. Той изпълнява останалата част от обхвата. Ако искате да видите промяната, вижте стойността при щракване върху диалоговия прозорец бутон .тогава ще видите

person Rasel    schedule 20.07.2011
comment
Някакво предложение за това как да постигна това, което искам да направя тогава? Искам да изчакам и да получа отговора на да или не, преди да изпълня останалите. Благодаря за помощта. - person TJ1; 20.07.2011
comment
просто поставете останалите в друг метод и извикайте след щракване - person Rasel; 20.07.2011

не можете да проверите стойността на yesOrNo веднага след като сте извикали b.show(). Това, че сега е показан диалоговият прозорец, не означава, че е щракнат бутон. Трябва да направите своя DO SOMETHING вътре в OnClickListener или да извикате метод от OnClickListener.

person Amandeep Grewal    schedule 20.07.2011

Следният тест не е на правилното място:

if (yesOrNo == 1) {
    DO SOMETHING;   
}

Той се оценява, след като вашият диалогов прозорец е създаден, а не след като потребителят щракне върху бутон. Така че yesOrNo все още е false по това време, а ние никога не DO SEOMTHING.

DO SOMETHING трябва да се намира в манипулатора onClick() на b.setPositiveButton().

person Shlublu    schedule 20.07.2011

Извикайте две отделни функции в positivebutton и negativebutton и напишете кода, който искате:

проба:

public void onListItemClick(ListView parent, View view, int position, long id) {

         b = new AlertDialog.Builder(this);

        b.setMessage("Are you sure?");
        b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

              yes();
                }
        });
        b.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                  no();
                }
        });
        b.show();
    Toast.makeText(this, "no", Toast.LENGTH_LONG).show();
    }

   public void yes()
   {
       Toast.makeText(this, "yes", Toast.LENGTH_LONG).show();
   }
   public void no()
   {
       Toast.makeText(this, "no", Toast.LENGTH_LONG).show();
   }
person Abhi    schedule 20.07.2011