Урок 67. Диалоги. ProgressDialog

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 67. Диалоги. ProgressDialog

Сообщение damager82 » 04 апр 2012, 23:00

В этом уроке:

- работаем с ProgressDialog

[url=http://www.startandroid.ru/ru/uroki/vse ... l:38uxjc8f]Click here to read this article![/url:38uxjc8f]
Последний раз редактировалось damager82 12 май 2017, 12:00, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Урок 67. Диалоги. ProgressDialog

Сообщение maxim » 25 июн 2012, 09:40

damager82 спасибо большое Вам за ваши уроки. У меня вопрос по поводу диалога, почему он не работает? Хочу повесить диалог на создание базы, но он не появляется. Как правильно выводить диалог в моем случае?

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

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ac_main);
		
		ProgressDialog pd = new ProgressDialog(this);
		pd.setTitle("Инициализация");
		pd.setMessage("Подождите идет инициализация базы данных.");
		pd.show(); 
		// Подключаемся к Базе
		db = new oDB(this);
		pd.dismiss();
	}

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 67. Диалоги. ProgressDialog

Сообщение KamiSempai » 25 июн 2012, 11:48

Советую дочитать все уроки до конца. Сразу станет понятно, что не так.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Урок 67. Диалоги. ProgressDialog

Сообщение maxim » 26 июн 2012, 15:32

KamiSempai писал(а):Советую дочитать все уроки до конца. Сразу станет понятно, что не так.
А не проще просто указать на 80 урок.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 67. Диалоги. ProgressDialog

Сообщение KamiSempai » 27 июн 2012, 08:25

maxim писал(а):А не проще просто указать на 80 урок.
Каюсь, не уточнил. Но если быть точным то это, пока, 80-90 уроки.
Вот еще на закуску: http://habrahabr.ru/post/114570/
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 67. Диалоги. ProgressDialog

Сообщение damager82 » 29 июн 2012, 15:28

Кстати диалоги, вроде, поддерживают межпроцессное взаимодействие. Из отдельного процесса можно сделать dismiss для диалога, работающего в UI-процессе.
Я где-то видел такое, но сам не тестил.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

zavbak
Сообщения: 6
Зарегистрирован: 25 янв 2012, 02:25

Re: Урок 67. Диалоги. ProgressDialog

Сообщение zavbak » 25 авг 2012, 03:14

Закроме первый диалог и откроем второй. Он две секунды повисит с анимацией ожидания

Здесь у Вас опечатка в первом слове.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 67. Диалоги. ProgressDialog

Сообщение math64 » 26 авг 2012, 10:06

damager82 писал(а):Кстати диалоги, вроде, поддерживают межпроцессное взаимодействие. Из отдельного процесса можно сделать dismiss для диалога, работающего в UI-процессе.
Я где-то видел такое, но сам не тестил.
И какой id указать для этого диалога? В отличие от id для виджетов, id для диалогов выбирает программист - вероятно, поэтому соответствующее API объявлено deprecated. Этот id известен только внутри активити, открывшей диалог - так что только она сможет его и закрыть.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 67. Диалоги. ProgressDialog

Сообщение AndreyI » 26 авг 2012, 10:17

damager82 писал(а):Кстати диалоги, вроде, поддерживают межпроцессное взаимодействие. Из отдельного процесса можно сделать dismiss для диалога, работающего в UI-процессе.
Я где-то видел такое, но сам не тестил.
Я так понимаю, имеются в виду потоки (threads), а не процессы?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 67. Диалоги. ProgressDialog

Сообщение damager82 » 29 авг 2012, 16:37

AndreyI писал(а):
damager82 писал(а):Кстати диалоги, вроде, поддерживают межпроцессное взаимодействие. Из отдельного процесса можно сделать dismiss для диалога, работающего в UI-процессе.
Я где-то видел такое, но сам не тестил.
Я так понимаю, имеются в виду потоки (threads), а не процессы?
Да. Надеюсь в уроках я нигде подобную фигню не ляпнул )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 67. Диалоги. ProgressDialog

Сообщение Foenix » 05 ноя 2012, 16:55

Сделала диалог по уроку (только без button), все классно, сообщения он из второго потока получает, меняет свой message..
одно заметила - он, оказывается, не модальный! я щелкаю по экрану эмулятора - диалог исчезает (хотя процесс длится!).
вот коды.
Это тут я его показываю и запускаю поток.

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

spinner = new ProgressDialog(MainActivity.this);
			spinner.setMessage("Идет загрузка...");
			spinner.show();			
			ThClass Thr = new ThClass(h);
			Thr.start();
А тут я его меняю, а так же исчезаю в зависимости от сообщения потока.

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

h = new Handler() {
			public void handleMessage(android.os.Message msg) {
				if (msg.what == 1) {
					spinner.dismiss(); 
				}
				if (msg.what == 2) {
					spinner.setMessage(msg.getData().getString("text"));
				}
			}
		};
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 67. Диалоги. ProgressDialog

Сообщение dcbp » 10 дек 2012, 22:22

Добрый вечер!
Автору уроков нереальное, огромнейшее спасибо, это лучшее, что есть в сети по андроиду!

Друзья, у меня 2 вопроса, никак не могу найти решение.

Есть код

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


OnClickListener LRClickListener = new OnClickListener(){

  		@Override
  		public void onClick(View v) {

  			ProgressDialog pd = new ProgressDialog(this);
  			pd.setTitle(R.string.app_name);
			
			pd.setMessage(R.string.please_wait);
			pd.setCancelable(false);
			pd.show();
 
  		}
    };
1) Ругается на эту строчку

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

ProgressDialog pd = new ProgressDialog(this);
Дело явно в контексте, перепробовал кажется все варианты, ничего не помогает. Может я что-то не до конца понимаю в контексте?

2) Почему ругается на

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

pd.setMessage(R.string.please_wait);
?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 67. Диалоги. ProgressDialog

Сообщение KamiSempai » 11 дек 2012, 00:38

1) Ругается по тому, что this ссылается не на Activity а на LRClickListener. this - это ссылка на класс в котором выполняется код.
Используйте <Имя класса Activity>.this
Например, если ваша активити называется MainActivity то нужно писать так: MainActivity.this
На самом деле уже давно избитая проблема, нет такого форума где не задали подобного вопроса )

2) Посмотрите внимательней на то, что именно принимает setMessage в качестве параметра. В этот метод нужно передавать объект CharSequence. String тоже подойдет, но Вы передаете int. "R.string.please_wait" - это id строки. Что бы получит саму строку можно воспользоваться getString(R.string.please_wait).
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 67. Диалоги. ProgressDialog

Сообщение dcbp » 11 дек 2012, 21:28

KamiSempai писал(а):1) Ругается по тому, что this ссылается не на Activity а на LRClickListener. this - это ссылка на класс в котором выполняется код.
Используйте <Имя класса Activity>.this
Например, если ваша активити называется MainActivity то нужно писать так: MainActivity.this
На самом деле уже давно избитая проблема, нет такого форума где не задали подобного вопроса )

2) Посмотрите внимательней на то, что именно принимает setMessage в качестве параметра. В этот метод нужно передавать объект CharSequence. String тоже подойдет, но Вы передаете int. "R.string.please_wait" - это id строки. Что бы получит саму строку можно воспользоваться getString(R.string.please_wait).
Большое, спасибо!
Очень стыдно за такие вопросы)

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

Re: Урок 67. Диалоги. ProgressDialog

Сообщение beeline09 » 02 июл 2013, 14:23

Добрый день всем! Есть следующая проблема с диалогами....
У меня есть активити, в нем на нажатие кнопки повешен хандлер. Хандлер в свою очередь запускает работу класса, который работает с БД MySQL. Класс, собственно, работает прекрасно, но когда я нажимаю на кнопку, то у меня весь интерфейс подвисает пока операция не завершится. А мне очень нужно отобразить прогресс диалог пока эта операция выполняется. Я слаб еще в java и после delphi мне очень сложно работать с классами хэндлерами и т.п. Может кто подсказать, что мне делать?
Класс, работающий с БД не содержит ни активити, ничего вообще.
Собственно, пример использовал отсюда: https://github.com/IskenHuang/android-m ... ent-sample и лишь немного переделал для себя. Кто знает решение?

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

Re: Урок 67. Диалоги. ProgressDialog

Сообщение Mikhail_dev » 02 июл 2013, 15:19

Работайте с AsyncTask. Вот что вам надо
[syntax=java]
class MyAsyncTask extends AsyncTask<Void, Void, Void> {

Activity myActivity;
public MyAsyncTask(Activity activity) {
myActivity = activity;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
myActivity.setProgressBarIndeterminateVisibility(true);
}

@Override
protected Void doInBackground(Void... params) {
//здесь выполнять работу с базой данных (этот метод выполняется в другом потоке)
return null;
}

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);

myActivity.setProgressBarIndeterminateVisibility(false);
}
}
[/syntax]
Только перед setContentView активности, надо поставить
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

тогда будет отображаться СТАНДАРТНЫЙ ProgressBar, справа сверху.
myActivity.setProgressBarIndeterminateVisibility(true);
и
myActivity.setProgressBarIndeterminateVisibility(false);
включают и отключают его.

Выполнение будет выглядеть как-то так
New MyAsyncTask(activity).execute();

Очередность выполнения такая
preExecute, далее doInBackground, далее, postExecute. Первый и третий выполняется в ОСНОВНОМ потоке, тогда как второй в ДРУГОМ.

edit. Все необходимые данные можно передать в конструктор. Я передаю туда объект активности для того, что бы ей включать и отключать её СТАНДАРТНЫЙ прогресс бар.

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

Re: Урок 67. Диалоги. ProgressDialog

Сообщение beeline09 » 02 июл 2013, 15:43

no-- писал(а):Работайте с AsyncTask. Вот что вам надо
[syntax=java]
class MyAsyncTask extends AsyncTask<Void, Void, Void> {

Activity myActivity;
public MyAsyncTask(Activity activity) {
myActivity = activity;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
myActivity.setProgressBarIndeterminateVisibility(true);
}

@Override
protected Void doInBackground(Void... params) {
//здесь выполнять работу с базой данных (этот метод выполняется в другом потоке)
return null;
}

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);

myActivity.setProgressBarIndeterminateVisibility(false);
}
}
[/syntax]
Только перед setContentView активности, надо поставить
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

тогда будет отображаться СТАНДАРТНЫЙ ProgressBar, справа сверху.
myActivity.setProgressBarIndeterminateVisibility(true);
и
myActivity.setProgressBarIndeterminateVisibility(false);
включают и отключают его.

Выполнение будет выглядеть как-то так
New MyAsyncTask(activity).execute();

Очередность выполнения такая
preExecute, далее doInBackground, далее, postExecute. Первый и третий выполняется в ОСНОВНОМ потоке, тогда как второй в ДРУГОМ.

edit. Все необходимые данные можно передать в конструктор. Я передаю туда объект активности для того, что бы ей включать и отключать её СТАНДАРТНЫЙ прогресс бар.
Спасибо большое за отклик, но как-то не так работает. Во-первых местоположение прогресса не знаю как сменить в случае myActivity.setProgressBarIndeterminateVisibility(true);, во-вторых, прогресс успевает появиться, но даже не крутится, а просто исчезает когда операция завершилась. И в-третьих, когда я вместо него пишу progressdlg.show() в onPreExecute и progressdlg.cancel() в onPostExecute, то прогресс появляется на долю секунды. Во время операции так же все подвисает. Что мне делать, если я хочу отобразить нормальный прогресс бар?

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

Re: Урок 67. Диалоги. ProgressDialog

Сообщение Mikhail_dev » 02 июл 2013, 16:46

Во-первых местоположение прогресса не знаю как сменить в случае myActivity.setProgressBarIndeterminateVisibility(true)
никак. он стандартный.
во-вторых, прогресс успевает появиться, но даже не крутится, а просто исчезает когда операция завершилась.
значит операцию работы с базой данных выполняете не в doInBackground

Если хотите свой использовать прогресс, то да, в preExecute начинайте показывать, в postExecute прекращайте показывать. Но работа, из-за которой у вас подвисает поток на время, должна быть в doInbackground

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

Re: Урок 67. Диалоги. ProgressDialog

Сообщение beeline09 » 04 июл 2013, 07:21

no-- писал(а):
Во-первых местоположение прогресса не знаю как сменить в случае myActivity.setProgressBarIndeterminateVisibility(true)
никак. он стандартный.
во-вторых, прогресс успевает появиться, но даже не крутится, а просто исчезает когда операция завершилась.
значит операцию работы с базой данных выполняете не в doInBackground

Если хотите свой использовать прогресс, то да, в preExecute начинайте показывать, в postExecute прекращайте показывать. Но работа, из-за которой у вас подвисает поток на время, должна быть в doInbackground
Спасибо большое за помощь! Всё получилось. Просто в doInBackground я запускал хэндлер, который выполнял функцию. Ну в общем с того примера, что я указал просто решил обработчик запустить ))

Аватара пользователя
Don77
Сообщения: 13
Зарегистрирован: 02 июл 2014, 00:21

Re: Урок 67. Диалоги. ProgressDialog

Сообщение Don77 » 21 ноя 2014, 18:29

В побочном потоке выполняется ресурсоемкая функция, как-то можно закрепить ProgressDialog пока выполняется процедура?Нажатие на кнопку назад закрывает диалог, для меня такое развитие событий нежелательно.

Ответить