Delphi FMX TVertScrollBox安卓端:强制显示垂直滚动条并隐藏水平滚动条
解决Delphi 10 Seattle安卓端TVertScrollBox滚动条显示问题
针对你遇到的TVertScrollBox在安卓端滚动条自动隐藏设置不生效、水平滚动条意外显示的问题,我分享几个经过验证的解决方案:
1. 直接调用安卓原生API强制设置滚动条属性
Delphi的FMX控件在安卓底层是基于原生Android控件实现的,我们可以直接获取原生ScrollView实例并修改其属性,这是最直接有效的方法。
在你的窗体或者TVertScrollBox的OnResize事件中添加以下代码:
uses FMX.Helpers.Android, Androidapi.JNI.Widget, Androidapi.JNI.JavaTypes; procedure TYourForm.VertScrollBox1Resize(Sender: TObject); var LNativeScrollView: JScrollView; begin // 获取安卓原生ScrollView的实例 LNativeScrollView := TJScrollView.Wrap(VertScrollBox1.GetObject); if Assigned(LNativeScrollView) then begin // 强制启用并始终显示垂直滚动条 LNativeScrollView.setVerticalScrollBarEnabled(True); LNativeScrollView.setScrollbarFadingEnabled(False); // 关闭滚动条自动淡出 // 彻底禁用水平滚动条 LNativeScrollView.setHorizontalScrollBarEnabled(False); end; end;
代码说明:
GetObject方法可以获取FMX控件对应的安卓原生控件实例setScrollbarFadingEnabled(False)会让垂直滚动条一直保持可见,不会在滚动结束后消失setHorizontalScrollBarEnabled(False)直接关闭水平滚动条的渲染,从根源避免其显示
2. 确保FMX层面的基础属性设置正确
在动手写代码前,先确认TVertScrollBox的基础属性配置:
- 将
ScrollBarVisible设为True - 将
AutoHide设为False
虽然安卓端可能不完全遵循这些FMX属性,但正确设置可以避免潜在的冲突。
3. 自定义TVertScrollBox子类(可选)
如果希望控件从创建时就应用这些设置,可以自定义一个子类并重写CreateHandle方法:
type TPersistentVertScrollBox = class(TVertScrollBox) protected procedure CreateHandle; override; end; procedure TPersistentVertScrollBox.CreateHandle; var LNativeScrollView: JScrollView; begin inherited; LNativeScrollView := TJScrollView.Wrap(GetObject); if Assigned(LNativeScrollView) then begin LNativeScrollView.setVerticalScrollBarEnabled(True); LNativeScrollView.setScrollbarFadingEnabled(False); LNativeScrollView.setHorizontalScrollBarEnabled(False); end; end;
之后在设计界面时,用这个自定义控件替换原生的TVertScrollBox即可。
额外注意事项
- 检查VertScrollBox内的所有子控件,确保它们的宽度不会超出VertScrollBox的范围,避免触发水平滚动的需求
- Delphi 10 Seattle的FMX安卓绑定存在一些小bug,若上述方法无效,尝试清理项目并重新编译安卓包
内容的提问来源于stack exchange,提问作者Scott Lynn
相关产品推荐
相关产品推荐

