Why won't controls span multiple columns or rows in an Android FireMonkey app?
I have a FireMonkey app with a GridPanelLayout, aligned to client. It's got 6 columns and 16 rows. Controls include glyphs, edits, and buttons. The TEdits span multiple columns, and the TButtons span both multiple columns and rows. The controls are currently all aligned to client.
When I compile and run on Windows everything looks and acts as expected. However, on Android devices (I tried two, Android 6.0.1, and Amazon FireOS) none of the controls span more than one column or row. They're each just one cell big. Instead of spanning 6 cols, TEdits span just 1 col; instead of spanning 2 cols and 2 rows, TButtons also span 1 col and 1 row.
Why won't the controls span multiple columns or rows on Android?
Both VCL and FireMonkey fail to store the
TGridPanelLayoutcorrectly when a frame/form gets subclassed or a frame placed on another frame/form.
Example: Drop a
TButtonin it on a
object GridPanelLayout1: TGridPanelLayout (...) ControlCollection = < item Column = 0 ColumnSpan = 2 Control = Button1 Row = 0 RowSpan = 2 end> object Button1: TButton Align = Client Size.Width = 421.000000000000000000 Size.Height = 257.000000000000000000 Size.PlatformDefault = False TabOrder = 0 Text = 'Button1' end end
When you later subclass the frame, the IDE tends to store a lot of redundant properties for the components it inherited from the base class. Usually after the first press of F9, the
RowSpanproperties get removed for no reason. On the subclass, it then looks something like this:
inherited GridPanelLayout1: TGridPanelLayout (...) ControlCollection = < item Column = 0 Control = Button1 Row = 0 end> inherited Button1: TButton Size.Width = 210.500000000000000000 Size.Height = 128.500000000000000000 end end
Note how the Size property has changed. Also, the
ControlCollectionitems get re-defined, yet the
RowSpanproperties are missing completely. This is the cause.
This bug applies to you because in FMX, specialized views for specific platforms are implemented as subclasses of the master view.
A version control system helps detecting when redundant properties sneak into DFM files. In the above example, it is legal to completely remove the
inherited GridPanelLayout1block when your subclass does not change it. Moreover, I advise you to build your project with no form designer window open as it often will corrupt your DFM file and re-add the redundant properties at every opportunity.