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

Элементы стиля на Андроид


gonzales

Вопрос

Доброго времени суток. Столкнулся вот с какой задачей. В этой ветке достаточно много примеров доступа к элементам стиля. Примерно так это работает

AObject := Form1.StyleBook1.Style.FindStyleResource('backgroundstyle');
    if (AObject is TRectangle) then
    TRectangle(AObject).Fill.Color := strtoint(node.GetAttribute('BackgroundColor'));
    Form1.StyleLookup := 'backgroundstyle';

НО!!! Такой подход работает только для Винды. Под Андроидом ничего не происходит, цвет не меняется. Ответа пока не нашел, если у кого есть идеи, с удовольствием выслушаю!

 

Заранее спасибо!

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

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

  • 0

Возможно это не работает потому, что для Андроида у вас нет стиля, либо он называется не так, либо в данном стиле нет нет элемента с именем 'BackgroundColor'.

Проверьте стили и убедитесь что структура имен совпадает.

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

Так, одно и тоже приложение, естественно стиль подключен и структура элементов такая же. Сам стиль прекрасно отрабатывает, не удается именно поменять элемент в рантайме.

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

Так, одно и тоже приложение

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

9 минут назад, gonzales сказал:

естественно стиль подключен и структура элементов такая же

Далеко не факт что это так.

Внутри StyleBook есть стили для разных платформ. Это может быть по одному стилю для каждой платформы, один стиль для нескольких платформ или даже всех сразу, может также быть что стиль для какой-то отдельной платформы вообще отсутствует.
Какой из этих случаев у вас?

Откройте редактор стилей, переключитесь на стиль для Андроид и сравните структуру со стилем для Виндовс.
Если они действительно одинаковы, покажите скриншоты и будем думать дальше.

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

Я так и думал.
то что он один - не означает что он для всех платформ.
ЕМНИП, дефолтный стиль предназначен для Виндовс.

Давайте в этом точно разберемся.
Сохраните стиль в файл, при сохранении выберите расширение файла .style
Откройте этот файл текстовым редактором.
Найдите в нем блок "object TStyleDescription"
Покажите что стоит в поле "PlatformTarget" и "MobilePlatform".
Или покажите весь блок.

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

Может после внесения изменений в стиль его нужно как-то сохранить?

Обычно после изменений и закрытия редактора студия спрашивает, принять ли сделанные изменения.
Ессно нужно нажимать "да" ?

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

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

Я имею в виду в рантайме

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

Давайте в этом точно разберемся.
Сохраните стиль в файл, при сохранении выберите расширение файла .style
Откройте этот файл текстовым редактором.
Найдите в нем блок "object TStyleDescription"
Покажите что стоит в поле "PlatformTarget" и "MobilePlatform".
Или покажите весь блок.

Нет у меня такого. Посмотрите, если не трудно. Файл в приложении

 

mystyle.zip

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

Верно, нету. Поэтому студия считает что стиль дефолтный и только (если не ошибаюсь) для Виндовс.

-сделайте копию проекта (на всякий),
-откройте редактор стилей
-удалите оттуда все стили
-добавьте два стиля из архива

В результате у вас должно появиться по одному стилю для Виндовс и Андроид. Стурктура в них одинаковая, различаются они лишь объектом TStyleDescription.
Откройте стиль в блокноте и увидите сами.

Попробуйте запустить программу под андроидом, должно заработать.

PS у меня были случаи когда этот объект исчезал при сохранении стиля в файл. В таком случае я открываю стиль в блокноте, вставляю этот объект ручками и потом снова загружаю этот стиль.

mystyles.zip

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

В результате у вас должно появиться по одному стилю для Виндовс и Андроид. Стурктура в них одинаковая, различаются они лишь объектом TStyleDescription.
Откройте стиль в блокноте и увидите сами.

Попробуйте запустить программу под андроидом, должно заработать.

при попытке открыть стиль для Андроида вылезает ошибка 

 

Снимок2.PNG

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

Cannot find style resource for Android

[16FB7AC0]{fmxstyledesigner240.bpl} FmxStyleController.TStyleController.PlatformToResourceName (Line 638, "FmxStyleController.pas" + 25) + $1E
[16FB7FA5]{fmxstyledesigner240.bpl} FmxStyleController.TStyleController.ChangePlatform (Line 729, "FmxStyleController.pas" + 18) + $C
[16FB69F7]{fmxstyledesigner240.bpl} FmxStyleController.TStyleController.Create (Line 248, "FmxStyleController.pas" + 35) + $9
[16FB2BEF]{fmxstyledesigner240.bpl} FmxStyleWindow.TStyleWindow.Create (Line 66, "FmxStyleWindow.pas" + 2) + $D
[16FBF721]{fmxstyledesigner240.bpl} FmxStyleEditors.DesignStyleBook (Line 80, "FmxStyleEditors.pas" + 2) + $B
[16FBF819]{fmxstyledesigner240.bpl} FmxStyleEditors.TResourceProperty.Edit (Line 97, "FmxStyleEditors.pas" + 2) + $A
[209CBF8E]{coreide240.bpl} PropInsp.TPropertyInspector.PropListEditDblClick (Line 965, "PropInsp.pas" + 18) + $6
[21483051]{vclide240.bpl} IDEInspListBox.TInspListBox.DoEditDblClick (Line 626, "IDEInspListBox.pas" + 2) + $A
[21484E4F]{vclide240.bpl} IDEInspListBox.TInspListBox.ListButtonClick (Line 1322, "IDEInspListBox.pas" + 2) + $2
[50AA409F]{vcl240.bpl  } Vcl.Controls.TControl.Click (Line 7429, "Vcl.Controls.pas" + 9) + $8
[2147A5F6]{vclide240.bpl} IDEListBtns.TListButton.WMLButtonUp (Line 584, "IDEListBtns.pas" + ? + $11
[50AA3B32]{vcl240.bpl  } Vcl.Controls.TControl.WndProc (Line 7313, "Vcl.Controls.pas" + 91) + $6
[0CDB514C]{TrackingSystem240.bpl} TrackingSystemHelp.CBTHookProc (Line 211, "TrackingSystemHelp.pas" + 27) + $F
[50AA7E8B]{vcl240.bpl  } Vcl.Controls.TWinControl.IsControlMouseMsg (Line 9906, "Vcl.Controls.pas" + 1) + $9
[50AA867D]{vcl240.bpl  } Vcl.Controls.TWinControl.WndProc (Line 10143, "Vcl.Controls.pas" + 158) + $6
[50AA7C9C]{vcl240.bpl  } Vcl.Controls.TWinControl.MainWndProc (Line 9850, "Vcl.Controls.pas" + 3) + $6
[50170DFC]{rtl240.bpl  } System.Classes.StdWndProc (Line 17187, "System.Classes.pas" + ? + $0
[50BF0155]{vcl240.bpl  } Vcl.Forms.TApplication.CancelHint (Line 11363, "Vcl.Forms.pas" + 6) + $D
[50BEEDE7]{vcl240.bpl  } Vcl.Forms.TApplication.ProcessMessage (Line 10534, "Vcl.Forms.pas" + 23) + $1
[50BEEE2A]{vcl240.bpl  } Vcl.Forms.TApplication.HandleMessage (Line 10564, "Vcl.Forms.pas" + 1) + $4
[50BEF15D]{vcl240.bpl  } Vcl.Forms.TApplication.Run (Line 10702, "Vcl.Forms.pas" + 26) + $3

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

Проверил у себя. Действительно, вылезла похожая ошибка. Понятия не имею что это такое, разбираться лень)

Удалил стиль для андроида. Еще раз его загрузил. Все ок. Проверил на устройстве - все ок.

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

1) Было что-то не так со стилем. Удалил из стилей все элементы, кроме двух простейших прямоугольников для background. После этого ошибка более не проявлялась.
2) Убедился что стиль для андроида доступен на устройстве, и нужные объекты присутствуют.

Действительно, под Андроид данный код не работает, и стили здесь ни при чем.
Что характерно, форма не обновляется, если ей присвоить новый стиль в рантайме. Внешний вид формы остается прежним.
Если вместо формы использовать например панель - стиль меняется.

Изменить цвет заливки конкретно в ресурсе у меня не удалось.
Это работает стандартным образом:

    AObject := Panel1.FindStyleResource('backgroundrect');
    if (AObject is TRectangle) then
        TRectangle(AObject).Fill.Color := TAlphaColorRec.Yellow;

Если позарез нужно менять стиль формы в рантайме - положите на нее панель с align=alClient, и меняйте стиль панели.
Попробуйте, может вас устроит такой способ.

И да, расскажите, для чего вы меняете цвет именно в ресурсе, а не в примененном стиле объекта.
Мне правда интересен такой кейс.

Изменено пользователем Barbanel
Ссылка на комментарий
  • 0
В 05.10.2018 в 16:24, Barbanel сказал:

Было что-то не так со стилем. Удалил из стилей все элементы, кроме двух простейших прямоугольников для background. После этого ошибка более не проявлялась

Да, я даже нашел, что это были за элементы. По одному перетягивал в новый стиль и ждал появления ошибки. 

В 05.10.2018 в 16:24, Barbanel сказал:

Что характерно, форма не обновляется, если ей присвоить новый стиль в рантайме. Внешний вид формы остается прежним.

Это, кстати, может быть связано с тем, что у формы помимо стиля в дизайн-тайме присвоен fill-brush. Заметил, что когда цвет установлен стиль не применяется.

В 05.10.2018 в 16:24, Barbanel сказал:

Изменить цвет заливки конкретно в ресурсе у меня не удалось.
Это работает стандартным образом:

Прикольно, попробую!!! То есть работаем не со стилем, а с конкретным объектом? Засада в том, что у меня динамические объекты и придется тогда их всех менять, это не совсем здорово.

Изменено пользователем gonzales
Ссылка на комментарий
  • 0
В 05.10.2018 в 16:24, Barbanel сказал:

Изменить цвет заливки конкретно в ресурсе у меня не удалось.
Это работает стандартным образом:


    AObject := Panel1.FindStyleResource('backgroundrect');
    if (AObject is TRectangle) then
        TRectangle(AObject).Fill.Color := TAlphaColorRec.Yellow;

Если позарез нужно менять стиль формы в рантайме - положите на нее панель с align=alClient, и меняйте стиль панели.
Попробуйте, может вас устроит такой способ.

Апну тему)))

Возникла все-таки необходимость менять цвета объектов в рантайме. Конкретно уперся в TSwitch (переключатель). Проблема в том, что элементы его стиля содержатся в объекте TSwitchObject. Но если сделать так

 

ReleSwitch.StyleLookup := 'switchstyledark';
  StyleObject:=ReleSwitch.FindStyleResource('switchstyledark');
  if (StyleObject is TSwitchObject) then
     TSwitchObject(StyleObject).FillOn.Color := TAlphaColorRec.Yellow;

то среда ругается, что не знает, что такое TSwitchObject. Попытка загуглить, где содержится TSwitchObject результатов не дала. Вопрос собственно простой, как поменять свойство FillOn у объекта TSwitchObject? 

Изменено пользователем gonzales
Ссылка на комментарий
  • 0
В 05.10.2018 в 16:24, Barbanel сказал:

И да, расскажите, для чего вы меняете цвет именно в ресурсе, а не в примененном стиле объекта.
Мне правда интересен такой кейс.

И вот настало долгожданное попозже))). Сорри, как-то проглядел вопрос. Я думал, что поменяв в рантайме сами элементы стиля мне не придется возиться с каждым объектом, который создается в рантайме. По сути хотел реализовать что-то типа смены цветовой схемы, например перед созданием объектов прохожу по используемым элементам стиля и меняю везде цвет на определенный. Далее создаю объекты, применяю к ним стиль и вуаля - цвет везде изменен на новый.

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

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

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

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

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

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

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

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

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

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

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