КИВИ: Могу ли я иметь прокрутку внутри прокрутки? - PullRequest
0 голосов
/ 04 августа 2020

Как следует из названия, я хочу иметь прокрутку внутри прокрутки. Я пробовал следующее, но вторая прокрутка не появляется вообще:

    from kivymd.app import MDApp
    from kivy.lang import Builder
    
    KV = '''
    <MyTile@SmartTileWithStar>
        size_hint_y: None
        height: "240dp"
    
    
    ScrollView:
    
        MDGridLayout:
            cols: 3
            adaptive_height: True
            padding: dp(4), dp(4)
            spacing: dp(4)
    
            MyTile:
                stars: 5
                source: "cat-1.jpg"
    
            MyTile:
                stars: 5
                source: "cat-2.jpg"
    
            MyTile:
                stars: 5
                source: "cat-3.jpg"
                
                
                
                
            ScrollView:
            
                MDGridLayout:
                    cols: 3
                    adaptive_height: True
                    padding: dp(4), dp(4)
                    spacing: dp(4)
            
                    MyTile:
                        stars: 5
                        source: "cat-1.jpg"
            
                    MyTile:
                        stars: 5
                        source: "cat-2.jpg"
            
                    MyTile:
                        stars: 5
                        source: "cat-3.jpg"
    '''
    
    
    class MyApp(MDApp):
        def build(self):
            return Builder.load_string(KV)
    
    
    MyApp().run()

Это не разрешено или что-то в этом роде? Поскольку текущий scrollview находится внутри RecycleView и работает нормально.

1 Ответ

0 голосов
/ 04 августа 2020

Я много раз отвечал на этот вопрос на SO, но сначала не узнал его. Проблема в том, что adaptive_height: True означает, что MDGridLayout запрашивает у своих потомков их высоту и использует это для вычисления минимальной высоты. В вашем случае внутренний ScrollView имеет значения по умолчанию size_hint (что составляет (1,1)). Каждый раз, когда вы используете adaptive_height (или height: self.minimum_height), вы должны убедиться, что дети имеют четко определенные высоты. Поскольку внутренний ScrollView не имеет четко определенной высоты, MDGridLayout присваивает ему нулевую высоту. Вот фрагмент вашего kv с одним возможным исправлением:

    ScrollView:    # this is the inner ScrollView
        size_hint_y: None
        height: inner_grid.height
        MDGridLayout:
            id: inner_grid
            cols: 3
            adaptive_height: True
            padding: dp(4), dp(4)
            spacing: dp(4)

Это определяет height внутреннего ScollView как height внутреннего MDGridLayout.

...