Перейти к содержанию
Fire Monkey от А до Я
  • 0

Диалоговое окно на Андроид.


Axbor

Вопрос

Хотел бы поделиться опытом. Рассмотрим случай, когда вам необходимо использовать кастомное диалоговое окно с затемнением. Вроде вот такого:Снимок3.PNGСнимок1.PNG

Первое, что приходит в голову, это использование Rectangle’ов. Но такой подход показался мне очень сложным, и я нашёл другой способ (многие о нём уже знают) создания кастомного окна.
Сам способ:

Создаем вторую форму, и изменяем следующие свойства:

Transparency = True

Fill->Color = #78000000

Fill->Kind = Solid

Поместим туда один TLayout, выставим свойство «Align» в значение «Center». И зададим нужный размер. Потом кидаем на TLayout компонент «TRectangle» со свойством «Align – Content». Чтобы TLayout не мешался во время design-time, присвоим свойству Locked значение True. Кидаем остальные компоненты, чтобы получить окно нужного нам вида.
В итоге у меня получилась вот такая иерархия компонентов:

Снимок2.PNG

Компонент TRectAnimation используем для анимирования процесса появления окна. Вы можете придумать свою анимацию. В данном случае анимируется свойства формы «Padding».

Напишем следующий код, для того, чтобы при клике на тёмную область формы окно закрылось (событие формы OnTap работает на сенсорных экранах, если вам нужен OnClick тогда воспользуйтесь Layout’ми или Rectangle’ми):

void __fastcall TForm2::FormTap(TObject *Sender, const TPointF &Point)
{
    Close();
}

Вот и всё. К сообщению, я приложил демо приложение с примером такого окна.

У администраторов просил бы поправить допущенные ошибки так как я не владею русским языком очень хорошем уровне. Или же добавит кое какие дополнительные информации ссылки и т.д.

 

Demo.zip

Изменено пользователем Andrey Efimov
Переписал сообщение с сохранением всех указанных свойств, кода, настроек. Оригинал могу предоставить всем желающим.
Ссылка на комментарий

Рекомендуемые сообщения

  • 1
  • Модераторы

krapotkin выкладывал когда-то MyDialogs

Изменения от меня:

  •   Переписан код, удалены лишние компоненты
  •   Подогнал под стандартные диалоги платформ
  •   Смена позиции кнопок "Oк", "Отмена" в зависимости от платформы
  •   Профиксил MaxLength для TEdit (при установке ограничении ввода символов для мобильных платформ)
  •   Возможность использования анонимных методов (TThreadProcedure)

MyDialogs_ZuBy.7z

Ссылка на комментарий
  • 0
В 4/27/2016 в 08:09, ZuBy сказал:

krapotkin выкладывал когда-то MyDialogs

Изменения от меня:

  •   Переписан код, удалены лишние компоненты
  •   Подогнал под стандартные диалоги платформ
  •   Смена позиции кнопок "Oк", "Отмена" в зависимости от платформы
  •   Профиксил MaxLength для TEdit (при установке ограничении ввода символов для мобильных платформ)
  •   Возможность использования анонимных методов (TThreadProcedure)

MyDialogs_ZuBy.7z

Можно ли как-то сделать чтобы по нажатию Enter на виртуальной клавиатуре фокус бы убивался?

Ссылка на комментарий
  • 0
  • Модераторы
Только что, Rusland сказал:

Можно ли как-то сделать чтобы по нажатию Enter на виртуальной клавиатуре фокус бы убивался?

наверное вы это имели ввиду

 <TMyInputQuery>.Edits[0].KillFocusByReturn := true;

 

Ссылка на комментарий
  • 0

ZuBy

В 27.04.2016 в 08:09, ZuBy сказал:

krapotkin выкладывал когда-то MyDialogs Изменения от меня: MyDialogs_ZuBy.7z

 

Не могу скачать, вылетает ошибка "Страница, к который вы пытаетесь получить доступ, недоступна для вашего аккаунта Код ошибки: 2C171/1"

Изменено пользователем GASCHE
Ссылка на комментарий
  • 0

Коллеги,
спасибо за проделанную работу. Работает пример как надо!

P.S.: Очень странно, что встроенный InputQueryAsync использует TEdit, а доступ к нему для преднастройки не дает.

P.P.S.: Авторы, krapotkin и ZuBy подскажите пожалуйста, как в DialogEvent узнать количество введенных в TMyInputQuery значений ( (Sender as TMyInputQuery).Values.Length не работает) ? 

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0
13 минуты назад, Pax Beach сказал:

P.P.S.: Авторы, krapotkin и ZuBy подскажите пожалуйста, как в DialogEvent узнать количество введенных в TMyInputQuery значений ( (Sender as TMyInputQuery).Values.Length не работает) ? 

Не бейте сильно, но только вот такое безобразие в голову пришло =)

procedure TFormMain.DialogEvent(Sender: TObject);
var
  i: integer;
  s: string;
begin
  s := '';
  try
    for i := 0 to 1000 do
      s := s + (Sender as TMyInputQuery).Values[i] + #13#10;
  finally

  end;

  ShowMessage('TNotifyEvent '#13#10 + s);
end;

UPD:

Отупение прошло. Но класс мне, конечно, надо будет переписать.

procedure TFormMain.DialogEvent(Sender: TObject);
var
  i: integer;
  s: string;
begin
  s := '';
  for i := 0 to (Sender as TMyInputQuery).Edits.count - 1 do
    s := s + (Sender as TMyInputQuery).Values[i] + #13#10;

  ShowMessage('TNotifyEvent '#13#10 + s);
end;

 

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0
  • Модераторы

там  есть вызов анонимной процедуры, в нем без танцев можно получить данные

var
  mY: TMyInputQuery;
begin
  mY := TMyInputQuery.Create(['Введите текст'], [''], self,
    procedure
    begin
      ShowMessage('TThreadProcedure ' + mY.Values[0]);
    end);
  mY.Edits[0].Password := true;
  mY.ShowMe;

 

Ссылка на комментарий
  • 0
1 минуту назад, ZuBy сказал:

там  есть вызов анонимной процедуры, в нем без танцев можно получить данные

 

Спасибо большое!

Я так понимаю, переход между TEdit по нажатию в виртуальной клавиатуре vkNext или vkReturn не реализовывался?

И кнопка по умолчанию тоже отсутствует?

 

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Pax Beach сказал:

Спасибо большое!

Я так понимаю, переход между TEdit по нажатию в виртуальной клавиатуре vkNext или vkReturn не реализовывался?

И кнопка по умолчанию тоже отсутствует?

Конечно, полная свобода. Что понадобится все можно прикрутить

        myInput.Edits[0].ReturnKeyType := TReturnKeyType.Done;
        myInput.Edits[0].KillFocusByReturn := true;
        myInput.Edits[1].ReturnKeyType := TReturnKeyType.Done;
        myInput.Edits[1].KillFocusByReturn := true;

 

Ссылка на комментарий
  • 0
  • Модераторы

Обновленная версия 

  • Более реалистичные диалоги для андроид 5.0 и выше

Screenshot_20160609-221625.png Screenshot_20160609-221629.png

MyDialogs_ZuBy.zip

Ссылка на комментарий
  • 0
  • Модераторы
5 минут назад, Alex7wrt сказал:

Очень полезный компонент. Большое спасибо!
Реализована ли здесь обработка нажатия клавиши "Отмена" касательно TMyInputQuery?

да, в базовом классе.

желательно обновиться с репозитория, там точно есть такое.

UPD: события на отмену нет, если вы об этом

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Да, об этом.
Уже разобрался. Сделал через bCancel.OnClick.
Появился еще один вопрос - клавиатура в альбомной ориентации перекрывает кнопки ОК и Отмена. Есть ли возможность поместить диалог выше?

UPD: Делаю через свойство TMyInputQuery.Top. Но пока не выходит...

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Alex7wrt сказал:

Да, об этом.
Уже разобрался. Сделал через bCancel.OnClick.
Появился еще один вопрос - клавиатура в альбомной ориентации перекрывает кнопки ОК и Отмена. Есть ли возможность поместить диалог выше?

такой возможности нет, по вы можете дописать

r1.Margin.Bottom :=  <сложные арифметические действия>;

 

Ссылка на комментарий
  • 0

День добрый

Воспользовался имеющимся примером MyDialogs для вывода своего диалогового окна. Но вот обнаружилась одна пробллемка. Если во время показа диалога "свернуть" приложение нажатием средней кнопки, а потом через меню запущенных приложений снова вернуться, то до перерисовки экрана выводятся артефакты. Такое наблюдается на двух устройствах с Android 4 и 5, в моём приложении и в примере ZuBy

 

Screenshot_2016-09-26-11-25-04.pngScreenshot_2016-09-26-11-25-11.pngScreenshot_2016-09-26-11-30-10.png

 

Добавлено: если в UBaseDialog убрать прозрачность формы, то и артефакты уходят.

Изменено пользователем sinuke
Ссылка на комментарий
  • 0
  • Модераторы
3 часа назад, sinuke сказал:

День добрый

Воспользовался имеющимся примером MyDialogs для вывода своего диалогового окна. Но вот обнаружилась одна пробллемка. Если во время показа диалога "свернуть" приложение нажатием средней кнопки, а потом через меню запущенных приложений снова вернуться, то до перерисовки экрана выводятся артефакты. Такое наблюдается на двух устройствах с Android 4 и 5, в моём приложении и в примере ZuBy

  Показать контент

Screenshot_2016-09-26-11-25-04.pngScreenshot_2016-09-26-11-25-11.pngScreenshot_2016-09-26-11-30-10.png

 

Добавлено: если в UBaseDialog убрать прозрачность формы, то и артефакты уходят.

правильней будет скрывать этот диалог при сворачивании, артефактов не будет

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...