AlertDialog

Интерфейс, диалоги, темы, стили, меню
Ответить
vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

AlertDialog

Сообщение vizort » 01 сен 2013, 01:18

решил вынести AlertDialog в другой класс

Код: Выделить всё

public class MyAlertDialogs {
	boolean exit;

	public boolean showAlertExit(AlertDialog.Builder alertDialog) {

		alertDialog.setTitle(R.string.exit);
		alertDialog.setMessage(R.string.exit_question);

		alertDialog.setPositiveButton(R.string.yes,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						exit = true;
					}
				});

		alertDialog.setNegativeButton(R.string.no,
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						dialog.cancel();
					}
				});

		alertDialog.show();
		return exit;
	}

}
ну вот проблема, когда AlertDialog открывается, метод проходит до конца и возвращает фолс, то есть даже если я нажму потом кнопку "yes" метод уже не вернет тру. Как исправить чтобы при нажатии кнопки "yes" возвращалось тру?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: AlertDialog

Сообщение Mikhail_dev » 01 сен 2013, 09:27

Никак. Измени метод на void, а внутри самого диалога возвращай значение самой булевой переменной, т.е.
[syntax=java5]
public class MyAlertDialogs {
boolean exit;

public void showAlertExit(AlertDialog.Builder alertDialog) {

alertDialog.setTitle(R.string.exit);
alertDialog.setMessage(R.string.exit_question);

alertDialog.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
exit = true;
return exit;
}
});

alertDialog.setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
exit = false;
return exit;
dialog.cancel();
}
});

alertDialog.show();
return exit;
}

}
[/syntax]
AlertDialog - асихронный элемент, после его создания, код продолжит дальше по методу выполняться.
По коду замечу:
1. Переменные стоит делать приватными
2. Если диалог вынесен в отдельный класс и отдельный метод, то может стоит сделать метод статическим, дабы можно было к нему обращаться как MyAlertDialogs.showAlertExit(); ?

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: AlertDialog

Сообщение vizort » 01 сен 2013, 13:04

не понял, как метод void onClick(...) может что то возвращать?!

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: AlertDialog

Сообщение Mikhail_dev » 01 сен 2013, 17:52

А ну да, конечно. Ну тогда можно сделать так:
[syntax=java5]
public class MyAlertDialogs {
boolean exit;

public void showAlertExit(AlertDialog.Builder alertDialog) {

alertDialog.setTitle(R.string.exit);
alertDialog.setMessage(R.string.exit_question);

alertDialog.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MyAlertDialogs.this.changeBooleanFlag(true);
return exit;
}
});

alertDialog.setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});

alertDialog.show();
}

private void changeBooleanFlag(boolean newExitValue) {
exit = newExitValue;
}
}
[/syntax]

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: AlertDialog

Сообщение vizort » 03 сен 2013, 17:48

не помогает...
если я у новосозданного объекта просто проверю состояние поля exit, то оно будет равно фолс.
и вы кстати опять забили про return у методе OnClick(...) ;)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: AlertDialog

Сообщение Mikhail_dev » 03 сен 2013, 18:54

1. У какого новосозданного объекта? Класс диалогами настоятельно рекомендую, даже настаиваю, делать еиничным объектом. Либо синглтон, либо статическим.
2. >и вы кстати опять забили про return у методе OnClick(...)
судя по коду, он возвращает void, т.е. не возвращает ничего. return вообще не нужен.

На самом деле, тут проблема у Вас больше в непонимании базовых вещей Java, потому как знание анонимных классом, интерфейсов, помогло бы тут. Вы скажите чего хотите более подробно, я постараюсь помочь.

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: AlertDialog

Сообщение vizort » 03 сен 2013, 22:48

Паттерны пока не учил, поэтому синглтон пока что отпадает...
А статический класс почему то сам еклипс не дает создать http://clip2net.com/s/5GvSG5

вообще как я говорил, я хочу вынести AlertDialog в отдельный класс и потом вызывать его с активити и если нажата кнопка да то переходить на определенный экран...

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: AlertDialog

Сообщение neoksi » 03 сен 2013, 22:57

no-- писал(а):1. У какого новосозданного объекта? Класс диалогами настоятельно рекомендую, даже настаиваю, делать еиничным объектом. Либо синглтон, либо статическим.
Ну тут я с тобой не соглашусь, нужно просто правильно организовывать callback методы и передавать на них ссылки в класс диалога.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: AlertDialog

Сообщение Mikhail_dev » 04 сен 2013, 10:13

А статический класс почему то сам еклипс не дает создать http://clip2net.com/s/5GvSG5
Потому что статическим может быть только внутренний класс. Я имел ввиду класс, у которого методы и переменные будут статическими. При этом никаких объектов городить не прийдется. Просто вызываем метод ИмяКласса.имяМетода();
Ну тут я с тобой не соглашусь, нужно просто правильно организовывать callback методы и передавать на них ссылки в класс диалога.
Какие коллбеки? Может всё же ссылки? Зачем на ровном месте усложнять?
Диалоги - это такая сущность, которая показывается всегда в единичном экземпляре (ведь не может быть сразу два диалога на экране), поэтому делать её нестатическим или не синглтоном - неправильно.
Разве не проще обращаться к диалогам таким образом? ИмяКласса.имяМетода(); ?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: AlertDialog

Сообщение neoksi » 04 сен 2013, 11:43

no-- писал(а):
Ну тут я с тобой не соглашусь, нужно просто правильно организовывать callback методы и передавать на них ссылки в класс диалога.
Какие коллбеки? Может всё же ссылки? Зачем на ровном месте усложнять?
Диалоги - это такая сущность, которая показывается всегда в единичном экземпляре (ведь не может быть сразу два диалога на экране), поэтому делать её нестатическим или не синглтоном - неправильно.
Разве не проще обращаться к диалогам таким образом? ИмяКласса.имяМетода(); ?
Мишь, тут ты не прав в корне, если у тебя вызывающая активити не синглтон, то может быть спокойно случай, когда отображается (находятся в памяти) две копии диалога. Посмотри на реализацию ДиалогФрагмента, что бы получить из него данные в активити, нам приходиться организовывать callback метод в активити и передавать на него ссылку в класс создающего диалог. Твоё утверждение о статичности или синглтонировании диалога не верно в корне, java имеет не линейную архитектуру исполнения программы.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: AlertDialog

Сообщение Mikhail_dev » 04 сен 2013, 13:28

Мишь, тут ты не прав в корне, если у тебя вызывающая активити не синглтон, то может быть спокойно случай, когда отображается (находятся в памяти) две копии диалога.
Отображается всегда один АлертДиалог. Если активность скрыта, то АлертДиалог просто умирает. И это основная причина, почему AlertDialog не рекомендуется к использованию, потому что при повороте экрана, он умирает. Я не прав?
Посмотри на реализацию ДиалогФрагмента, что бы получить из него данные в активити, нам приходиться организовывать callback
Нет, не приходится, а рекомендуется. Можешь почитать эту тему.
И еще кое что
java имеет не линейную архитектуру исполнения программы.
Не совсем понял о какой линейности идет речь. Да даже не понял причем тут это. Ты путаешь мягкое со сладким. Я говорю о том, что диалог всегда на экране один и что в таком случае, стоит его сделать в виде статического класса. Ты же мне начинаешь говорить о том, как лучше взаимодействовать с активностями, когда я об этом вообще речи не веду. Но даже если и затронуть эту тему, то могу сказать, что когда я работал с диалогами, то передавал всё в нужный метод, что мне требовалось. К примеру контекст активности для отображения, либо тот же слушатель.
Не стоит путать ДиалогФрагменты с Алертиалогами. Первые из них куда гибче, тога как вторые лучше вообще не использовать. А если использовать, то для каких-то простых вещей.
И кстати, возвращаясь к линейной архитектуре исполнения программы. Ну ассемблер линейный. А что еще линейное?
Твоё утверждение о статичности или синглтонировании диалога не верно в корне
какое утверждение? я лишь говорю, как лучше сделать и почему это лучше так сделать. если что-то представляет единичный экземпляр, то стоит сделать интерфейс к этой штуке в единичном экземпляре. По мне это очень даже очевидно.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: AlertDialog

Сообщение neoksi » 04 сен 2013, 15:42

Ок, давай закроем тему, просто мы друг-друга недопонили.
Голосом потом обсудим.

vizort
Сообщения: 49
Зарегистрирован: 02 мар 2013, 22:43

Re: AlertDialog

Сообщение vizort » 05 сен 2013, 18:37

так помогите, пожалуйста, сделать с помощью синглтона, например.

Ответить