Pull to refresh

Создание пошагового мастера

Недавно делал форму регистрации для Android-приложения. Инфрмации надо много, а люди боятся больших форм. Ничего похожего не нашёл, поэтому решил написать самостоятельно.

Как это работает.


Вы создаёте ViewGroup. Я предпочитаю RelativeLayout, почему — объясню позже. В эту группу вкладываете свои шаги, это должны быть LinearLayout вертикальной ориентации. Подключаете мой класс и пишете пару строк кода. Пошаговая форма готова.

Использование


Самый простой вариант

new StepMaster(this).setSteps(R.id.steps).setButtons(true, true, true).create();

Конструктор принимает активити, setSteps принимает id контейнера, setButtons — какие создавать кнопки. Получается форма с шагами из #steps и кнопками «Previous», «Next», «Finish».

Полноценное использование

sm = new StepMaster(this)
        .setSteps(R.id.steps) //Тот же контейнер. Должен быть RelativeLayout, 
                //иначе при анимации шаги будут располагаться не так, как хочется
        .setButtons(R.array.masterButtons) //string-array со словами «Назад», «Далее», «Финиш»
        .setAnimations(
                R.anim.la_slide_left_out, R.anim.la_slide_left_in,
                R.anim.la_slide_right_out, R.anim.la_slide_right_in)
        // Анимации. Лежат в каталоге /res/anim/
        // Благодаря им старый шаг съезжает влево, давая место новому
        .setOnStepListener(new StepMaster.OnStepListener() {
            @Override
            public boolean onStepChange(
                int oldStep, int newStep, byte direction, final StepMaster master) {
                if (direction == StepMaster.DIRECTION_BACKWARD) //Не препятствуем движению назад
                    return true;
                // true == разрешить сменить шаг
                // false == предотвратить смену шага
                // тут можно проверить форму на заполнение, например
                return true;
            }   // onStepChange
            @Override
            public void onStepChanged(int step, StepMaster master) {
                // можно отслеживать изменения шага
                currentStep = step; //у меня currentStep — переменная активити
            }
            @Override
            public void onFinish(StepMaster sm) {
                // вызывается при нажатии на «Финиш»
            }
        })
        .create();

Я написал массу реализаций представленных выше функций. Создать кнопки можно по две-три за раз, отдавая кнопку (метод принимает TextView или любого его наследника, поэтому можно передать почти любую кнопку), String, int resource id. Анимации можно отдавать по одной, по паре или все четыре сразу; тип — Animation либо int.

Также стоит обратить внимание на аргумент direction, отдаваемый слушателю: он может равняться DIRECTION_FORWARD, DIRECTION_BACKWARD или DIRECTION_RANDOM. Последнее значение direction принимает при программном изменении номера шага более, чем на один.
Я использовал direction в приложении, чтобы давать спокойно двигаться назад, но при движении вперёд проверять заполнение полей формы.

Поворот экрана

После поворота снова откроется первый шаг.

Чтобы это победить, нужно создать переменную, которая будет хранить номер текущего шага, в последнем примере это currentStep. Она может быть статичной, а может передаваться через savedInstanceState. Теперь при создании мастера нужно до вызова .create() и до установки слушателя явно указать текущий шаг:

.setStep(currentStep)


Конечно, переменная currentStep должна быть инициализирована как 0. Если слушатель уже установлен а мастер уже создан, для тихого переключения шага нужно вызвать код:
.setStep(currentStep, true, true)

Такое обращение подавит анимацию и вызов события.

Картинки!


Вот пара скринов.
Форма регистрации Подтверждение

Исходник


Исходник лежит здесь.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.