在KivyMD的RecycleView
组件中,我正在处理多列布局。为了简化说明,以下代码片段仅包含一个预期单行展示的ref
列和一个应该占据屏幕剩余空间且文本能够完全可读地自动换行的message
列。这两列都采用MDLabel
实例实现:
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.recycleview import RecycleView
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.label import MDLabel
from random import randrange
from loremipsum import get_sentences
Builder.load_string('''
<RVLayout>:
spacing: 2
size_hint: None, None
height: message.texture_size[1]
MDLabel:
size_hint_x: None # 设置标签宽度随文本内容自适应
halign: 'center'
text: root.ref
md_bg_color: app.theme_cls.bg_darkest
MDLabel:
id: message
text: root.message
md_bg_color: app.theme_cls.bg_darkest
<RV>:
viewclass: 'RVLayout'
RecycleBoxLayout:
spacing: 2
default_size: None, dp(10)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
''')
class RVLayout(BoxLayout):
ref = StringProperty()
message = StringProperty()
def on_size(self, *args):
self.height = self.ids.message.texture_size[1]
class RV(RecycleView):
def __init__(self, **kwargs):
super(RV, self).__init__(**kwargs)
self.data = [
{
'ref': str(x).zfill(8),
'message': ' '.join(get_sentences(randrange(1, 4)))
} for x in range(50)]
class TestApp(MDApp):
def build(self):
return RV()
if __name__ == '__main__':
TestApp().run()
可以看到,我在RVLayout
类中添加了一个on_size
方法,确保在调整尺寸(桌面场景下)时能保持良好的视觉效果:
在任何窗口宽度下,message
元素的高度都能恰到好处地适应,而ref
列的宽度始终保持不变:
现在遇到的问题是,当我以大于1的密度值启动应用时(比如设置了环境变量KIVY_METRICS_DENSITY=2
),尽管字体增大,但ref
列的宽度依旧不变,导致了以下显示效果:
那么,如何让ref
列的宽度随屏幕密度自适应调整呢?