Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Можно ли оформить AlertDialog в виде функции? - Программирование Android

22.05.2013, 05:22. Просмотров 2440. Ответов 33
Метки нет (Все метки)

Помогите новичку! С Делфи перехожу на Яву

Создал класс, внутри процедуру для диалога Да-Нет. Успешно вызывается, но...

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static int res = 0;
 
...
        AlertDialog.Builder quitDialog = new AlertDialog.Builder(context);
        quitDialog.setTitle(TextTitle);
 
        res = 0;
        
        quitDialog.setPositiveButton(TextYes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                res = 1;
            }
        });
 
        quitDialog.setNegativeButton(TextNo, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                res = 2;
            }
        });
 
        quitDialog.show();
        return res; 
...
Результат всегда 0

Где ошибка???
Хотелось бы использовать через
res = MyAsk("Уверены?", "Да","Нет")
if (res == 1) ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 05:22     Можно ли оформить AlertDialog в виде функции?
Посмотрите здесь:
Android Можно ли сделать так, чтобы AlertDialog не закрывался
AlertDialog Android
Android AlertDialog Error
Custom AlertDialog Android
Android AlertDialog и RadioGroup
Android Закрытие AlertDialog
Android Spinner в AlertDialog
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
JIyrApy
32 / 32 / 1
Регистрация: 22.08.2010
Сообщений: 251
22.05.2013, 10:12     Можно ли оформить AlertDialog в виде функции? #2
А если static убрать?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 11:40     Можно ли оформить AlertDialog в виде функции? #3
Цитата Сообщение от Tester64 Посмотреть сообщение
Результат всегда 0
потому что функция возвращает результат прежде чем вы нажмете да/нет.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 11:52  [ТС]     Можно ли оформить AlertDialog в виде функции? #4
>> потому что функция возвращает результат прежде чем вы нажмете да/нет
Это я понял, но как это обойти?
Как приостановить отправку RETURN до погашения формы?

Java
1
2
3
quitDialog.show();
// что-то вставить между ними???
return res;
>> А если static убрать?
Тогда не могу устанавливать значение res = 1; res = 2; Говорит "ошибка - неизвестная RES".
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 11:59     Можно ли оформить AlertDialog в виде функции? #5
Цитата Сообщение от Tester64 Посмотреть сообщение
Как приостановить отправку RETURN до погашения формы?
не нужно этого делать, просто выполняйте все необходимые действия в методах onClick.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 12:34  [ТС]     Можно ли оформить AlertDialog в виде функции? #6
не нужно этого делать, просто выполняйте все необходимые действия в методах onClick.
Ну очень хочется не вставлять каждый раз 20 строк для создани и обработки класического "Да/Нет", а вызвать одну функцию. И написать только (чаще всего) обработку на "Да":
Java
1
2
3
4
res = MyAsk("Уверены?", "Да","Нет");
if (res == 1) {
...
}
Добавлено через 9 минут
Пробовал поставить цикл

Java
1
2
3
4
quitDialog.show();
visible = 1;
while (visible == 1) ;
return res; //
Где visible =0; в обработчиках кнопок. Но получаю полное зависание и даже диалог не вызывается... Не показывается на экран.

Раньше работал в Делфи - там все шло в один поток, графика и логика. И если я говорил показать форму, то она показывалась СРАЗУ, а не дожидалась окончания обработки. В яве все непривычно... Есть текствьюв, на который добавляю строки в процессе работы. Обработка длится секунд 30. Пока не закончится обработка, вьюв почему-то не обновляется и остается пустым.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 13:08     Можно ли оформить AlertDialog в виде функции? #7
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
quitDialog.setPositiveButton(TextYes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                clickedYes();
            }
        });
 
        quitDialog.setNegativeButton(TextNo, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                clickedNo();
            }
        });
в чем проблема?

Добавлено через 4 минуты
или
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void showYesNoDialog(DialogInterface.OnClickListener yesCallback, DialogInterface.OnClickListener noCallback){
AlertDialog.Builder quitDialog = new AlertDialog.Builder(context);
        quitDialog.setTitle(TextTitle);
        
        quitDialog.setPositiveButton(TextYes, yesCallback);
 
        quitDialog.setNegativeButton(TextNo, noCallback);
 
        quitDialog.show();
 
}
 
...
showYesNoDialog(
new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               //обрабатываем ответ да
            }
        },
 
new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               //обрабатываем ответ нет
            }
        });

Добавлено через 28 секунд
Цитата Сообщение от Tester64 Посмотреть сообщение
сть текствьюв, на который добавляю строки в процессе работы. Обработка длится секунд 30. Пока не закончится обработка, вьюв почему-то не обновляется и остается пустым.
выносите обработку в отдельный поток.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:11  [ТС]     Можно ли оформить AlertDialog в виде функции? #8
Цитата Сообщение от V0v1k Посмотреть сообщение
в чем проблема?
Не понял... Мне хочется результатом функции получить 1 на Да, 2 на Нет, 0 на ничего не нажато (рядом с вопросом что вызвало закрытие). Как это получить из Вашего кода? Мне не хочется плодить лишних функций -реакций на Да и Нет. Просто вызываю функцию, она останавливает ход работы кода пока не получит отклик от пользователя. Обрабатывает отклик и меняет ход работы в зависимости от ответа. Можно применить для тестов/опросников.
Например:
Java
1
2
3
4
5
6
res1 = AskYesNo("Вы высокий?", "Да", "Нет");
res2 = AskYesNo("Вы толстый?", "Да", "Нет");
res3 = AskYesNo("Вы курите?", "Да", "Нет");
...
res40 = AskYesNo("Вы умеете летать?", "Да", "Нет");
If (res1+res2+res3>2) {...}
пришлось бы МНОГО обработчиков нажатий плодить...

А можно воткнуть на выход из программы
Такая функция есть в API Windows и я к ней привык.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 13:12     Можно ли оформить AlertDialog в виде функции? #9
Цитата Сообщение от Tester64 Посмотреть сообщение
- там все шло в один поток, графика и логика. И если я говорил показать форму, то она показывалась СРАЗУ, а не дожидалась окончания обработки
ну так в любом случае да/нет нажмете ведь не сразу, return не опередите...
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:15  [ТС]     Можно ли оформить AlertDialog в виде функции? #10
Цитата Сообщение от V0v1k Посмотреть сообщение
выносите обработку в отдельный поток.
А как? И зачем?
Например код:
...
ToView("Сделали пункт 1");
...
ToView("Сделали пункт 2");
...
ToView("Сделали пункт 3");
...
но пока не закончим ВСЕ вьюв пустой. Потом сразу текста на несколько страниц.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 13:17     Можно ли оформить AlertDialog в виде функции? #11
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
showYesNoDialog("Вы высокий?",
new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               res1 = 1;
               showQuestionAboutWeight();
            }
        },
 
new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               res1 = 2;
               showQuestionAboutWeight();
            }
        });
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:18  [ТС]     Можно ли оформить AlertDialog в виде функции? #12
Цитата Сообщение от V0v1k Посмотреть сообщение
ну так в любом случае да/нет нажмете ведь не сразу, return не опередите...
Я готов остановить работу, повесить програму пока не дождусь ответа... Ведь если я вывел вопрос, значит он мне реально важен. По крайней мере в однопоточных не графических приложениях
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 13:27     Можно ли оформить AlertDialog в виде функции? #13
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void showQuestionAboutWeight() {
showYesNoDialog("Вы толстый?",
         new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               res2 = 1;
               showQuestionAboutSmoking();
            }
        },
 
new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               res2 = 2;
               showQuestionAboutSmoking();
            }
        });
}
Добавлено через 1 минуту
Цитата Сообщение от Tester64 Посмотреть сообщение
Я готов остановить работу, повесить програму пока не дождусь ответа... Ведь если я вывел вопрос, значит он мне реально важен. По крайней мере в однопоточных не графических приложениях
вы можете делать вызов с отдельного потока который будете останавливать методом wait(), а после ответа запускать методом notifyAll(), но как-то это не по ООПшному

Добавлено через 2 минуты
Цитата Сообщение от Tester64 Посмотреть сообщение
А как? И зачем?
Например код:
...
ToView("Сделали пункт 1");
...
ToView("Сделали пункт 2");
...
ToView("Сделали пункт 3");
...
но пока не закончим ВСЕ вьюв пустой. Потом сразу текста на несколько страниц.
для этого есть AsyncTask, или просто потоки..

советую прочитать уроки по андроиду или книгу.

Добавлено через 1 минуту
изначально все выполняется в UI потоке, если вам нужно что-то долго обрабатывать выносите в отдельный поток.

Добавлено через 1 минуту
Прочитайте книжку про ООП, сейчас вы пытаетесь все сделать в процедурном стиле.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:32  [ТС]     Можно ли оформить AlertDialog в виде функции? #14
Цитата Сообщение от V0v1k Посмотреть сообщение
[JAVA]showQuestionAboutWeight()
Тоесть при 400 вопросах я должен вместо 400 строк плодить 400 функций с 800 обработчиками..

Цитата Сообщение от V0v1k Посмотреть сообщение
вы можете делать вызов с отдельного потока который будете останавливать методом wait(), а после ответа запускать методом notifyAll(), но как-то это не по ООПшному
А вот здесь по подробнее пожалуста... По делфям понимаю что близко, но java выдает на wait() ошибки:

Cannot make a static reference to the non-static method wait() from the type Object Askers.java
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 13:32     Можно ли оформить AlertDialog в виде функции? #15
и я бы предпочел форму с радиобатонами вместо десятка диалогов...
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:44  [ТС]     Можно ли оформить AlertDialog в виде функции? #16
Прочитайте книжку про ООП, сейчас вы пытаетесь все сделать в процедурном стиле
Какие ГЛАВЫ читать в книжках (вычитывать 400-600 листов ради одной процедурки...)
Вообще-то я думал что у меня одна процедура "провести тест" или "выходим из программы". Вызывается на нажатие кнопки и длится до обработки всех ответов пользователей. "вы уверены что выходим?" "Документ не сохранен, сохранить?".

Вроде делфи был тоже ООП, но в яве все так запутанно... Классы, методы, обрабочики. Все в одном потоке. Хочешь что-бы не подвисал главный поток в процессе обработки - создавал другие потоки, но если это не критично, пусть повисит пока думает. В яве же куча не нужных обработчиков создающие кучу параллельных подпотоков и вызываемых почти независимо от остальной программы...

Добавлено через 3 минуты
Цитата Сообщение от V0v1k Посмотреть сообщение
и я бы предпочел форму с радиобатонами вместо десятка диалогов...
Иногда следующий вопрос зависит от предыдущего:
Вы мужчина?
Паять умеете? / Какой у вас размер лифчика?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 14:16     Можно ли оформить AlertDialog в виде функции? #17
Цитата Сообщение от Tester64 Посмотреть сообщение
Тоесть при 400 вопросах я должен вместо 400 строк плодить 400 функций с 800 обработчиками..
нет, 400 диалогов это в любом случае плохо, как я уже написал, лучше формы с радиобатонами.
с диалогами в ООПшном стиле может выглядеть примерно так:
Java
1
2
3
4
5
Dialog d400 = new QuestionDialog("Вопрос", null);
Dialog d399 = new QuestionDialog("Вопрос", d400);
...
Dialog d1 = new QuestionDialog("Вопрос", d2);
d1.show();
или так
Java
1
2
3
4
questionQueue.add(new QuestionDialog("Вопрос"));
questionQueue.add(new QuestionDialog("Вопрос2"));
questionQueue.add(new QuestionDialog("Вопрос3"));
questionQueue.start();
Добавлено через 1 минуту
Цитата Сообщение от Tester64 Посмотреть сообщение
Иногда следующий вопрос зависит от предыдущего
нет проблем, можно динамически добавлять такие вопросы, или отделить в первую форму вопросы от которых зависят другие вопросы.

Добавлено через 4 минуты
Цитата Сообщение от Tester64 Посмотреть сообщение
Cannot make a static reference to the non-static method wait() from the type Object Askers.java
а где это вы пытаетесь вызвать?

Добавлено через 56 секунд
нельзя в статик методах вызывать не статические методы этого же класса.

Добавлено через 7 минут
Цитата Сообщение от Tester64 Посмотреть сообщение
А вот здесь по подробнее пожалуста...
ну примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class QuestionThread extends Thread{
        private Object mLock = new Object();
        @Override
        public void run() {
            QuestionDialog d1 = new QuestionDialog("Вопрос");
            d1.show();
            mLock.wait();
                        String result = d1.getResult();
        }
        
        public void next(){
            mLock.notifyAll();
        }
    }
    ....
    @Override
    public void onClick(DialogInterface dialog, int which) {
                result = 1;
        questionThread.next();
    }
диалоги можно в цикле создавать и вызывать и свести код к минимуму, все от твоей фантазии зависит...

Добавлено через 2 минуты
Цитата Сообщение от Tester64 Посмотреть сообщение
Какие ГЛАВЫ читать в книжках (вычитывать 400-600 листов ради одной процедурки...)
ну чтобы перестроить свое мышление с процедур на объекты одной главы недостаточно.

Добавлено через 9 минут
все же советую отказаться от вывода сотен диалогов и продумать нормальную форму для заполнения...

Добавлено через 36 секунд
дурной тон такое диалогами делать.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 16:54  [ТС]     Можно ли оформить AlertDialog в виде функции? #18
ну чтобы перестроить свое мышление с процедур на объекты одной главы недостаточно.
От многолетнего опыта Делфи тяжело отказаться - привычка работать компонентами. Коллекционировать "идеально отлаженые" процедуры/функции. Проще потратить день на написание класса и потом использовать одну строку/функцию вместо страницы кода. Например вывод простого Тоста вывел в public static int AskInfo(Context context, String TestInfo, int shot)
вызывается как Askers.AskInfo(this, "ура", 1) ; И в теории поменяв/доработав процедуру смогу сменить его стиль хоть на свой дизайн (цвета, прозрачность, рамка). Программу же перебирать не прийдется...

Посоветуйте все-же какие Главы Явы помогут мне понять принцип построение андроид-ява-обработчиков.

все же советую отказаться от вывода сотен диалогов и продумать нормальную форму для заполнения...
Пока тесты делать не планирую. Просто пример очень удачный был. Скорее в программе десяток разных мест, "опасных для пользователя", когда стоит вывести предупреждения "вы уверены?" "сохранить?" "обновить?" "перегрузить?". Каждый раз определять переменные, подключать классы, писать обработчики, учитывать последовательность обработки... Или одна строчка "уверены - нет - выход из процедуры"
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 17:42     Можно ли оформить AlertDialog в виде функции? #19
Цитата Сообщение от Tester64 Посмотреть сообщение
"уверены - нет - выход из процедуры"
вот от этого нужно отказаться, выполнение кода не должно ждать ответа пользователя, все реализуется калбеками/ивентами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2013, 18:24     Можно ли оформить AlertDialog в виде функции?
Еще ссылки по теме:
Потоки и AlertDialog Android
Android Не показывается AlertDialog
Android TextView а AlertDialog
Не работает AlertDialog Android
Android Создание AlertDialog со списком

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 18:24  [ТС]     Можно ли оформить AlertDialog в виде функции? #20
Цитата Сообщение от V0v1k Посмотреть сообщение
вот от этого нужно отказаться, выполнение кода не должно ждать ответа пользователя, все реализуется калбеками/ивентами.
Тяжелая "ломка" логики. Если честно, не вижу преимущества такого подхода. Мелкие модификации превращаются в полное переписывание логики. Например была длинная процедура синхронизации гаджета с сервером (реальная ситуация). В середине обработки решил спросить пользователя, хочет ли он (например) после получения данных отправить свои. И... вынужден "нарезать" процедуру Sinhro на 3 - до вопроса(с обрезанием всего что было раньше), ДА и НЕТ вместо IF ELSE. А если захочется вставить еще несколько вопросов, то вместо "ветвей IF" получаю 5-8 разных "вложеных калбеков". А синхронизацию некоторых явно прийдется вести через "потоки" и "мютексы". Круто для многоядерных андроидов, но абсолютно бесполезно для "офисных" приложений.

Слышал что ява намного гибче Делфи. Подделать ява-вские калбеки/инвайты в делфи легко. А можно ли подделать однопоточную Делфи в Ява?
Yandex
Объявления
22.05.2013, 18:24     Можно ли оформить AlertDialog в виде функции?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru