KivyMD中ILeftBodyTouch多组件实现:列表项同时放置复选框与图标
解决方案
默认OneLineAvatarIconListItem的左侧容器宽度固定,且文本位置没有适配左侧容器宽度,才会出现内容重叠、多组件无法正常展示的问题,调整KV布局规则即可实现需求:
完整可运行代码
from kivy.lang import Builder from kivymd.uix.list import OneLineAvatarIconListItem from kivymd.app import MDApp class MainApp(MDApp): def __init__(self, **kwargs): super(MainApp, self).__init__(**kwargs) self.kv = Builder.load_string(''' #:kivy 2.0.0 #:import dp kivy.metrics.dp <MDCheckbox>: size_hint: None, None size: "48dp", "48dp" <LeftContainer@ILeftBodyTouch+MDBoxLayout>: adaptive_width: True spacing: dp(4) MDCheckbox: MDIconButton: icon: "account" size_hint: None, None size: "48dp", "48dp" <OneLineLeftAdaptiveListItem@OneLineAvatarIconListItem>: # 让原生左侧容器自适应宽度 _left_container: adaptive_width: True # 调整文本位置避免和左侧组件重叠 _txt_head: x: self.parent.ids._left_container.width + dp(16) LeftContainer: MDList: OneLineLeftAdaptiveListItem: text: "First" OneLineLeftAdaptiveListItem: text: "Second" OneLineLeftAdaptiveListItem: text: "Third" ''') def build(self): return self.kv if __name__ == '__main__': MainApp().run()
关键修改说明
- 给自定义左侧容器
LeftContainer添加间距,避免两个组件挤在一起 - 移除原代码中错误的on_size宽度计算逻辑,直接给列表项原生左侧容器
_left_container设置自适应宽度 - 调整列表项文本的左侧偏移量,避免文本和左侧交互组件重叠
- 继承
ILeftBodyTouch保证容器内所有交互组件(复选框、图标按钮)都能正常响应触摸操作
内容的提问来源于stack exchange,提问作者Omid Ketabollahi
相关产品推荐
相关产品推荐

