Kivy Android 应用在更改 BoxLayout 大小并同时滚动时崩溃? 用户场景:想法 1:防止使用多点触控思路 2:禁用 ScrollView 或将 do_scroll 属性更改为 False

问题描述

我使用 Python 框架 Kivy 开发了一个 Android 应用。布局使用 BoxLayouts 分为两部分(“upper_space”和“lower_space”)。如以下屏幕截图所示(抱歉尺寸太大):

enter image description here

用户场景:

用户在“lower_space”区域滚动并同时点击“upper_space”区域上的按钮(多点触控)。应用崩溃。

按钮改变了两个 BoxLayout 的高度。我们如何才能防止应用在所描述的用户场景中崩溃,甚至无需更改我的整个布局?

“lower_space”区域的内容应该是可滚动的,在这个例子中它是一个包含 SmartTiles 的 GridLayout,但它也可以是其他任何东西,比如带有多个按钮、标签、图像等的长 BoxLayout。 “upper_space”应该是静态的(不可滚动的),比如带有改变 BoxLayout 高度的按钮的图像或文本。

这是我的代码

from kivymd.app import MDApp
from kivy.lang import Builder

kv = '''
BoxLayout:
    orientation: 'vertical'
    
    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            id: upper_space
            orientation: 'vertical'
            size_hint_y: 0.3
            
            BoxLayout:
                id: title_bar
                orientation: 'horizontal'
                size_hint_y: 0.3
                    
                MDIconButton:
                    icon: 'delete'
                    size_hint_x: 1
                    on_release:
                        app.size_hint_y_layouts('upper_space','lower_space',1)
                        
            BoxLayout:
                id: preview_widget
                orientation: 'vertical'
                size_hint_y: 0.8
                
                MDLabel:
                    text: 'Some Label'
                    halign: 'center'
        
        BoxLayout:
            id: lower_space
            orientation: 'vertical'
            size_hint_y: 0.7
            
            ScrollView:    
                id: somescroll
                GridLayout:
                    id: somegrid
                    cols: 2
                    row_default_height:
                        (self.width - self.cols*self.spacing[0])/self.cols
                    row_force_default: True
                    size_hint_y: None
                    height: self.minimum_height
                
                    SmartTileWithLabel:
                        Box_color: [0.2,0.2,1]
                        text: "Tile1"
                        font_style: 'H3'
                        
                    SmartTileWithLabel:
                        Box_color: [0.2,1]
                        text: "Tile2"
                        font_style: 'H3'
                
                    SmartTileWithLabel:
                        Box_color: [0.2,1]
                        text: "Tile3"
                        font_style: 'H3'
                
                    SmartTileWithLabel:
                        Box_color: [0.2,1]
                        text: "Tile4"
                        font_style: 'H3'
                        
                    SmartTileWithLabel:
                        Box_color: [0.2,1]
                        text: "Tile5"
                        font_style: 'H3'
'''

class MainApp(MDApp):
    
    def __init__(self,**kwargs):
        super(MainApp,self).__init__(**kwargs)
    
    def build(self):
        screen = Builder.load_string(kv)
        return screen
    
    def size_hint_y_layouts(self,layout1,size_hint_y1,layout2,size_hint_y2):
        self.root.ids[layout1].size_hint_y = size_hint_y1
        self.root.ids[layout2].size_hint_y = size_hint_y2
    
if __name__ == '__main__':
    MainApp().run()

我想过多种选择,但也许您有更好的主意?

想法 1:防止使用多点触控

由于多点触控功能在我的应用中不是那么重要,我可以完全禁用它。使用以下代码会导致在 Android 手机上出现奇怪的行为(滚动不起作用)。我猜这是因为代码是针对 PC 平台的。是否有适用于智能手机触摸屏的修改版本?

from kivy.config import Config
Config.set('input','mouse','mouse,multitouch_on_demand')

思路 2:禁用 ScrollView 或将 do_scroll 属性更改为 False

不幸的是,两者都没有解决我的问题,因为应用程序在所描述的用户场景中不断崩溃。请注意,在更改 BoxLayout 的高度后,我必须再次将 do_scroll 属性设置为 True,并且我必须再次启用 ScrollView,因为“lower_space”区域可能有很多内容(它必须是可滚动的!)。以下是我尝试过的一些代码片段(只有按钮的事件发生了变化,其余代码相同):

MDIconButton:
    icon: 'delete'
    size_hint_x: 1
    on_release:
        root.ids['somescroll'].do_scroll = False
        app.size_hint_y_layouts('upper_space',1)
        root.ids['somescroll'].do_scroll = True

这里:

MDIconButton:
    icon: 'delete'
    size_hint_x: 1
    on_release:
        root.ids['somescroll'].disabled = True
        app.size_hint_y_layouts('upper_space',1)
        root.ids['somescroll'].disabled = False

在此先感谢您的帮助!

2021 年 8 月 3 日更新:这里是日志的一小部分:

03-08 10:45:15.991 18259  4607 I python  :  RecursionError: maximum recursion depth exceeded
03-08 10:45:15.991 18259  4607 I python  : Python for android ended.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...