Пример модальных диалогов для 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();
        }
    }
}

Вот так это выглядит в новом красивом но не очень удобном (я уже привык к прошлому) эмуляторе.

modal dialog example

8 Комментарии “Пример модальных диалогов для Android

  1. Мавр, по андройдику бы побольше…
    А то, вот, может возьму себе андройдовый девайс…

Комментарии закрыты