How To Adjust Listbox Items Height To Fit The Text In Firemonkey (android)?
Solution 1:
Pop your resizing code in the OnApplyStyleLookup event.
Written off the top of my head and way past bedtime:
procedure TForm1.ListBoxItemApplyStyleLookup(Sender: TObject);
var O: TFMXObject;
begin
O := (Sender as TListBoxItem).FindStyleResource('text');
if O is TText then
(Sender as TListBoxItem).Height := (O as TText).Height;
end;
You will, of course, need to set the event for every item you create.
Solution 2:
As mentioned by Mike Sutton, it can be done OnApplyStyleLookup
event.
I do it using a TTextLayout
:
uses
... ,FMX.TextLayout;
procedure TfrmForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var
myLayout: TTextLayout;
aPoint: TPointF;
begin
myLayout := TTextLayoutManager.DefaultTextLayout.Create;
myLayout.BeginUpdate;
// Setting the layout MaxSize
aPoint.X := ListBoxItem1.Width;
aPoint.Y := TfrmForm1.Height;
myLayout.MaxSize := aPoint;
myLayout.Text := ListBoxItem1.Text;
myLayout.WordWrap := True ;
myLayout.Font := ListBoxItem1.Font;
myLayout.HorizontalAlign := ListBoxItem1.TextSettings.HorzAlign;
myLayout.VerticalAlign := ListBoxItem1.TextSettings.VertAlign;
myLayout.Padding := ListBoxItem1.Padding;
// set other properties as needed
myLayout.EndUpdate;
ListBoxItem1.Height := Trunc(myLayout.TextHeight) + 3 ; // +3px to be sure to see entire text
end;
Note that MaxSize
is limitating. For example, aPoint.Y
will limit the final TextHeight
. You should set it large because, whatever TextHeight
should be, if myLayout.TextHeight
is larger than myLayout.MaxSize.Y
then myLayout.TextHeight
will be set to myLayout.MaxSize.Y
.
Here's a list of TTextLayout
properties.
Solution 3:
Here is the Mike Sutton's code, improved and tested by me. Works for case of an Item with a Detail text (.ItemData.Detail). The variant with TextLayout did not work for me.
This code is tested for Windows and Android application.
procedure TTestForm.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var item: TListBoxItem absolute Sender;
function CalcHeight( SubStyle: String ): Single;
var Obj: TFMXObject; T: TText absolute Obj;
begin
Obj := item.FindStyleResource(SubStyle);
if Obj is TText
then Result := T.Canvas.TextHeight(T.Text)
+ T.Margins.Top + T.Margins.Bottom
+ T.Padding.Top + T.Padding.Bottom
else Result := 0;
end;
begin
item.Height := CalcHeight('text')
+ CalcHeight('detail');
end;
Solution 4:
There are one important thing about changing size of control: "For mobile platform, firemonkey fix height and with some controls". Because:
- UI Style Guidline for each platform define rules about size of standart controls.
- Firemonkey uses raster style, so you cannot change some control size, because you will lost a quality of view
However, you can remove this contraints. Look at the my solution this (Auto translated with Google): Can not increase the height TProgressBar
This article about TProgressBar, But you can use this approach also for a TListBoxItem.
Post a Comment for "How To Adjust Listbox Items Height To Fit The Text In Firemonkey (android)?"