Android: использование AlertDialog при длительном нажатии на элемент из списка - PullRequest
0 голосов
/ 20 июля 2011

У меня есть список элементов, созданный в виде списка. Я хотел бы долго нажимать на один из элементов в списке и открывать диалоговое окно с предупреждением, и в зависимости от того, да или нет, в этом диалоговом окне я хочу установить глобальную переменную. Код, который я использую, находится внутри «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 не изменяется независимо от того, нажимаю ли я «Да» или «Нет». Может кто-нибудь сообщить мне, что не так с кодом?

Спасибо за помощь.

Ответы [ 5 ]

2 голосов
/ 20 июля 2011

AlertDialog не ждет выбора. После вызова метода show() эти две строки будут выполнены немедленно:

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

Таким образом, значение переменной yesOrNo будет ее начальным значением.

Решение

Вы можете вызывать doSomething(0) в onClick() метод positiveButton и doSomething(1) в onClick() метод отрицательной кнопки.

0 голосов
/ 20 июля 2011

Вызовите две отдельные функции в положительной и отрицательной кнопках и напишите нужный код:

пример:

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();
   }
0 голосов
/ 20 июля 2011

Следующий тест находится не в нужном месте:

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

Он оценивается после создания диалогового окна, а не после нажатия пользователем кнопки.Таким образом, yesOrNo все еще false в то время, и мы никогда не должны * DO SEOMTHING.

DO SOMETHING находиться в обработчике b.setPositiveButton() s onClick().

0 голосов
/ 20 июля 2011

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

0 голосов
/ 20 июля 2011

yesOrNo меняется. Но вы не можете его перехватить. Поскольку AlertDialog является асинхронным, он не ожидает щелчка. Он выполняет остальную часть области. Если вы хотите увидеть изменение, то увидите значение при нажатии.на кнопку диалога. затем вы увидите

...