Пример модальных диалогов для Android
Здравствуйте, дорогие слушатели, сегодня в нашем подкасте вы узнаете о том как создать красивый стандартный индикатор загрузки в своем приложении... Ой, а что, никто не записывает?! Ну, ладно... тогда проговаривайте (можно про себя) текст и думайте что это подкаст.
И нет, я не курил, просто настроение хорошее.
В общем решил показать массам как выглядит код моего e-banking'a. Но что-то меня берёт жадность (нету духа опенсорса) показывать именно код приложения, поэтому я тут по-быстрому сговнял классик, который показывает на экране кнопку при нажатии на которую вылазит алерт с вопросом да/нет, при нажатии на "да" вылазит прогрессбар и потом пропадает а при нажатии на "нет" - ничего не происходит.
Кстати, я уже скачал себе новую SDK 1.6. Так что можете сравнить вид эмуляторов. Ну и раз уж я заговорил о ней то надо сказать что наличие новых методов для работы с CDMA, я не оценил, зато заметил что починили баг c URLConnection, а это не может не радовать :).
package ua.kiev.mabp;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import java.util.Random;
public class MyActivity extends Activity {
// список диалогов
private static final int CONFIRM = 1;
private static final int PROGRESS = 2;
// счетчик вызовов
private int counter;
/**
* Метод вызывается один раз при создании активности
*
* @param savedInstanceState предыдущее состояние активности
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Создаем кнопку
Button button = new Button(this);
button.setText("click me!");
// вешаем на неё листенер
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// котрый покажет диалог CONFIRM
showDialog(CONFIRM);
}
});
// сетим кнопку в основной лайаут
setContentView(button, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
}
/**
* Метод вызывается один раз на каждый диалог
*
* @param id номер диалога онисан в начале класса
* @return диалог
*/
@Override
protected Dialog onCreateDialog(int id) {
super.onCreateDialog(id);
switch (id) {
case CONFIRM:
// новый лайаут для диалога
LinearLayout confirmView = new LinearLayout(this);
// создаем диалог с параметрами и двумя кнопками
return new AlertDialog.Builder(MyActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setView(confirmView)
.setTitle("Title")
.setMessage("Message")
// положительная кнопка с листенером который показывает диалог PROGRESS
.setPositiveButton("Click me!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// запустит новый диалог загрузки
showDialog(PROGRESS);
// в новом потоке
new Thread(new Runnable() {
public void run() {
// запустит фоновую процедуру
wasteMyTime();
// по завершении которой в основном потоке
MyActivity.this.runOnUiThread(new Runnable() {
public void run() {
// диплог загрузки закроется
dismissDialog(PROGRESS);
}
});
}
}).start();
}
})
// отрицатильная кнопка просто скроет диалог
.setNegativeButton("Cancel", null)
.create();
case PROGRESS:
// Диалог загрузки
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("Please, waite...");
dialog.setMessage("Dummy message about loading...");
// без процентов
dialog.setIndeterminate(true);
// можно закрыть кнопкой телефона
dialog.setCancelable(true);
return dialog;
default:
return null;
}
}
/**
* Метод вызывается каждый раз перед появлением диалога
*
* @param id номер появляющегося диалога
* @param dialog сам диалог
*/
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case CONFIRM:
((AlertDialog) dialog).setMessage("Этот диалог был вызван " + (++counter) + " раз");
break;
default:
break;
}
}
/**
* Метод просто тратит время
*/
public static void wasteMyTime() {
Random random = new Random();
for (int i = 0; i < 10000; i++) {
random.nextGaussian();
}
}
}
Вот так это выглядит в новом красивом но не очень удобном (я уже привык к прошлому) эмуляторе.

Свежие комментарии