• 0
gonzales

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

Вопросы

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 ответ на этот вопрос

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 минут назад, gonzales сказал:

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 минут назад, Barbanel сказал:

Внутри StyleBook есть стили для разных платформ.

У меня один стиль для всех платформ. Скрин приложил

 

Снимок.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Может надо заполнить поле Platform?

Form1.StyleBook1.Styles[0].Platform

Снимок1.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 минут назад, Barbanel сказал:

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

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

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

 

Снимок2.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Покажите нормально ошибку, тут же ничерта не видно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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
18 минут назад, Barbanel сказал:

Проверил на устройстве - все ок.

В смысле стиль применяется или меняется его элемент?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 пользователей онлайн

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