Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

22.05.2013, 05:22. Просмотров 2565. Ответов 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) ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 05:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли оформить AlertDialog в виде функции? (Программирование Android):

Можно ли сделать так, чтобы AlertDialog не закрывался - Программирование Android
Можно ли сделать так чтобы AlertDialog не закрывался если обнаруживается что пользователь ввел неверные данные?

AlertDialog - Программирование Android
ЗДравствуйте! Имеется простая игра. Когда ХП игрока == 0, я останавливаю игру и хочу показать AlerDialog. Рисуется все на канвас. Вот...

Custom AlertDialog - Программирование Android
Помогите люди добрые, что то никак не нагуглю... А желательно кодом;)

Потоки и AlertDialog - Программирование Android
Помогите, пожалуйста, бьюсь уже несколько дней. Создаю файловый менеджер. Это моя первая программа под Android, поэтому не всегда догоняю. ...

Не работает AlertDialog - Программирование Android
Почему в данном случае не работает AlertDialog? public class MainActivity : Activity { int count = 1; ...

Spinner в AlertDialog - Программирование Android
Как Spinner в AlertDialog сделать? AlertDialog вызываю через нажатие fab. AlertDialog.Builder builder = new...

33
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 13:44  [ТС] #16
Прочитайте книжку про ООП, сейчас вы пытаетесь все сделать в процедурном стиле
Какие ГЛАВЫ читать в книжках (вычитывать 400-600 листов ради одной процедурки...)
Вообще-то я думал что у меня одна процедура "провести тест" или "выходим из программы". Вызывается на нажатие кнопки и длится до обработки всех ответов пользователей. "вы уверены что выходим?" "Документ не сохранен, сохранить?".

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

Добавлено через 3 минуты
Цитата Сообщение от V0v1k Посмотреть сообщение
и я бы предпочел форму с радиобатонами вместо десятка диалогов...
Иногда следующий вопрос зависит от предыдущего:
Вы мужчина?
Паять умеете? / Какой у вас размер лифчика?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 14:16 #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 секунд
дурной тон такое диалогами делать.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 16:54  [ТС] #18
ну чтобы перестроить свое мышление с процедур на объекты одной главы недостаточно.
От многолетнего опыта Делфи тяжело отказаться - привычка работать компонентами. Коллекционировать "идеально отлаженые" процедуры/функции. Проще потратить день на написание класса и потом использовать одну строку/функцию вместо страницы кода. Например вывод простого Тоста вывел в public static int AskInfo(Context context, String TestInfo, int shot)
вызывается как Askers.AskInfo(this, "ура", 1) ; И в теории поменяв/доработав процедуру смогу сменить его стиль хоть на свой дизайн (цвета, прозрачность, рамка). Программу же перебирать не прийдется...

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

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

Слышал что ява намного гибче Делфи. Подделать ява-вские калбеки/инвайты в делфи легко. А можно ли подделать однопоточную Делфи в Ява?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 18:53 #21
именно из-за использования одного потока это все происходит, вы работаете в UI потоке и задержка выполнение метода это зависание интерфейса, поэтому и нужно тяжелые операции выносить в отдельные потоки.
а в дэлфи(точнее в фреймворке а не в самом языке) судя по вашим словам в архитектуре встроено отделение вызываемых процедур в отдельный от UI поток. почитайте главу про потоки, а то видимо у вас складывается ложное впечатление.

Добавлено через 4 минуты
а если хотите чтобы было как в делфи, создавайте потоки и юзайте wait(), notify() как я уже писал выше.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 19:36  [ТС] #22
Цитата Сообщение от V0v1k Посмотреть сообщение
а если хотите чтобы было как в делфи, создавайте потоки и юзайте wait(), notify() как я уже писал выше.
Пробовал - полное зависание. Причем Wait потребовал завернуть в TRY скобки. И все-равно "глобальная ошибка"

именно из-за использования одного потока это все происходит, вы работаете в UI потоке и задержка выполнение метода это зависание интерфейса, поэтому и нужно тяжелые операции выносить в отдельные потоки.
а в дэлфи(точнее в фреймворке а не в самом языке) судя по вашим словам в архитектуре встроено отделение вызываемых процедур в отдельный от UI поток. почитайте главу про потоки, а то видимо у вас складывается ложное впечатление.
В виндосовских потоках неплохо разбираюсь (мютексы, семафоры, приоритеты, приостановки...). Насколько знаю в Линуксе та-же технология. А Андроид по той-же технологи склеен. Думаю отличий не много. Немного не так обьяснил про Делфи. Там каждое окно - это поток. Некоторые окна (вроде АПИ-шных диалогов ДА-НЕТ) сами останавливают текущий поток, дожидаются своих обработок и возвращают только результат в место прошлой остановки. У большинства окошек есть команда ShowModal (вместо Show), которая принудительно останавливает текущий поток для ожидания отклика от нового окна - вызывающее окно становится недоступным пока не закроется вызываемое. Думал что и в ява подобное...
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 20:24 #23
здесь дело не в языке, а в самой архитектуре андроида, весь UI в одном потоке, все методы которые вызываются UIем - в том же потоке, методы жизненного цикла активити - в этом же потоке.

Добавлено через 1 минуту
Цитата Сообщение от Tester64 Посмотреть сообщение
В виндосовских потоках неплохо разбираюсь (мютексы, семафоры, приоритеты, приостановки...). Насколько знаю в Линуксе та-же технология. А Андроид по той-же технологи склеен. Думаю отличий не много.
я думал wait() и notify() это первое с чего начинают изучение потоков, а у вас на них зависание)
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 20:42  [ТС] #24
Цитата Сообщение от V0v1k Посмотреть сообщение
здесь дело не в языке, а в самой архитектуре андроида, весь UI в одном потоке, все методы которые вызываются UIем - в том же потоке, методы жизненного цикла активити - в этом же потоке.

я думал wait() и notify() это первое с чего начинают изучение потоков, а у вас на них зависание)
Начал вычитывать потоки на яве... немного непривычные методы создания потоков. В делфях я редко использовал wait() и notify(). Обычно хватало "запустить" и "убить поток". Реже взаимные блокировки через защищенные области или мютексы/семафоры для доступам к общим данным или вывода в графику.

Не до конца понимаю использование потоков в ГРАФИКЕ(диалогах) андроида. Похоже я глушил первичный поток до вывода диалога (хоть и после команды SHOW). А следовательно обработчики кнопок никогда не сработают.

Можно ли приостановить ТЕКУЩИЙ/ОСНОВНОЙ поток (UI) пока работает другой? Можно ли вызвать диалоговое окно (вопрос ДА-НЕТ) в отдельном потоке и обработчики нажатий на кнопки выполнить в нем-же? Как обрабатывается нажатие ВНЕ вопроса - диалог гаснет, а кнопки не нажаты? Не зависнет ли первый поток (забыли разблокировать)?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 20:55 #25
Цитата Сообщение от Tester64 Посмотреть сообщение
Можно ли приостановить ТЕКУЩИЙ/ОСНОВНОЙ поток (UI) пока работает другой?
нет, основной(UI) поток никогда не нужно приостанавливать или даже нагружать длительными процессами.

Цитата Сообщение от Tester64 Посмотреть сообщение
Можно ли вызвать диалоговое окно (вопрос ДА-НЕТ) в отдельном потоке
как бы то понятнее объяснить, любые изменения юая можно делать только в UI потоке, но можно из другого потока вызвать выполнение определенного кода в UI потоке(Handler, View.post(), runOnUiThread(), AsyncTask)


Цитата Сообщение от Tester64 Посмотреть сообщение
и обработчики нажатий на кнопки выполнить в нем-же
изначально все процедуры(в java правильно говорить методы) которые вызывает UI выполняются в UI потоке, вы можете из них запустить отдельный поток, но нельзя задерживать их выполнение(зависание UIя)


Цитата Сообщение от Tester64 Посмотреть сообщение
Как обрабатывается нажатие ВНЕ вопроса - диалог гаснет, а кнопки не нажаты?
должен быть отдельный калбек для этого, нужно в документацию глянуть.


Цитата Сообщение от Tester64 Посмотреть сообщение
Не зависнет ли первый поток (забыли разблокировать)?
не понял этого вопроса.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.05.2013, 21:41  [ТС] #26
изначально все процедуры(в java правильно говорить методы) которые вызывает UI выполняются в UI потоке, вы можете из них запустить отдельный поток, но нельзя задерживать их выполнение(зависание UIя)
Тоесть как ни крути, а сделать функцию вызова чужого аска(кнопки, галочки, списки) со своими обработчиками в виде функции возвращающей код результата обработки пользователем НЕЛЬЗЯ! По любому прийдется РАЗРЫВАТЬ старую процедуру на ДО вызыва диалога и обработчики. Т.к. никак НЕЛЬЗЯ приостановить OnButton1Click, вызвать ЛЮБОЙ другой диалог и результат вернуть в ЭТУже обработку нажатия кнопки. Нельзя завесить UI.
Нельзя в момент работы OnButton1Click обработать нажатие ДА (бесконечный цикл тоже отпадает)...

Действительно ява - самый "гибкий язык", на котором можно сделать все...
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 21:49 #27
да, нельзя задерживать/останавливать UI поток, он отвечает за реакцию на действия пользователя и за обновление отображения на дисплеи. задержка UI потока это просто зависание интерфейса.

Добавлено через 1 минуту
и еще раз повторяю, дело не в языке(поток он и в африке поток), а в архитектуре андроида, в делфи все точно также просто фреймворк берет на себя эту работу с потоками(создает потоки, вызывает wait/notify), а в андроиде такого нет.
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
23.05.2013, 04:52  [ТС] #28
Пожалуй понял... Спасибо за ответы. Буду вычитывать теорию для деталей, но суть понял...
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
25.05.2013, 10:19  [ТС] #29
У меня последний (пока чисто-теоретический) вопрос: Если бы я писал свои проекты на VC++, я бы смог создать такую функцию? Там (вроде) не используются колбеки так часто. Имеет ли переходить на Си? Все ли (из того что может на андроид под ява) можно написать на VC++?? Слышал что Си более продвинут и используется для использования "хакерских" возможностей (нижний уровень апи). А как он относится к обычным формам?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 11:59 #30
ну, во первых не VC++, а просто С/С++.
я не имею опыта написания под андроид на С/С++, но не думаю что там с потоками как-то по-другому.
0
25.05.2013, 11:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 11:59
Привет! Вот еще темы с ответами:

TextView а AlertDialog - Программирование Android
Здравствуйте! Вот столкнулся с такой проблемой, не могу Textview вывести в AlertDialog. Помогите пожалуйста!

Не показывается AlertDialog - Программирование Android
Хочу при запуске проверить есть ли на устройстве Сервисы Google Play public class MainActivity extends FragmentActivity { ...

AlertDialog и RadioGroup - Программирование Android
Всем привет. Создаю программу, в которой в открывшемся диалоговом окне происходит настройка сортировки списка. И там есть radiogroup,...

AlertDialog Error - Программирование Android
Всем доброго времени суток! Изучал изготовление своего AlertDialog по учебнику и на одном из сайтов, но увы столкнулся с проблемой, после...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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