Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 屏幕未在kivy中切换_Android_Python 3.x_Kivy_Kivy Language - Fatal编程技术网

Android 屏幕未在kivy中切换

Android 屏幕未在kivy中切换,android,python-3.x,kivy,kivy-language,Android,Python 3.x,Kivy,Kivy Language,我正在尝试将屏幕从recycleview切换到一个简单的标签。我为此添加了一个屏幕管理器。当我在recycleview中的任何视图上检测到触摸时,我正在尝试添加屏幕并切换到它。我打算显示检测到触摸的视图内容。但屏幕没有切换 from kivy.app import App from kivy.lang import Builder from kivy.uix.recycleview import RecycleView from kivy.uix.recycleview.views import

我正在尝试将屏幕从recycleview切换到一个简单的标签。我为此添加了一个屏幕管理器。当我在recycleview中的任何视图上检测到触摸时,我正在尝试添加屏幕并切换到它。我打算显示检测到触摸的视图内容。但屏幕没有切换

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.label import Label
from kivy.properties import BooleanProperty
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.screenmanager import ScreenManager,Screen

Builder.load_string('''
<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    ScreenManager:
        id:sm
<OneLabel>:
    name:'one'
    Label:
        text:'one'
<RV>:
    viewclass: 'SelectableLabel'
    SelectableRecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
        multiselect: False
        touch_multiselect: False
''')
class OneLabel(Screen):
    pass

class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    ''' Adds selection and focus behaviour to the view. '''


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            self.ids.sm.switch_to(OneLabel())
            pass


class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(100)]


class MakeApp(App):
    def build(self):
        return RV()

if __name__ == '__main__':
    MakeApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.recycleview导入recycleview
从kivy.uix.recycleview.views导入RecycleDataViewBehavior
从kivy.uix.label导入标签
从kivy.properties导入布尔属性
从kivy.uix.recycleboxlayout导入recycleboxlayout
从kivy.uix.behaviors导入焦点行为
从kivy.uix.recycleview.layout导入LayoutSelectionBehavior
从kivy.uix.screenmanager导入screenmanager,屏幕
Builder.load_字符串(“”)
:
#绘制背景以指示选择
在以下情况之前:
颜色:
rgba:(.0,0.9,1,3)如果自选,则为其他(0,0,0,1)
矩形:
pos:self.pos
大小:self.size
屏幕管理器:
id:sm
:
姓名:“一”
标签:
正文:“一”
:
viewclass:“SelectableLabel”
可选择的可循环利用布局:
默认大小:无,dp(56)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
多重选择:错误
触摸多选:错误
''')
一级标签(屏幕):
通过
类SelectableRecycleBoxLayout(焦点行为、布局选择行为、,
可回收性布局):
“将选择和焦点行为添加到视图中。”
类SelectableLabel(RecycleDataViewBehavior,Label):
''将选择支持添加到标签''
索引=无
selected=布尔属性(False)
可选=布尔属性(真)
def刷新\视图\属性(自身、rv、索引、数据):
''捕获并处理视图更改''
self.index=索引
返回超级(SelectableLabel,self)。刷新\u视图\u属性(
rv、索引、数据)
def on_触控向下(自身,触控):
''在触地时添加选择''
如果是超级(SelectableLabel,self)。打开时触摸下(触摸):
返回真值
如果自碰撞点(*touch.pos)和自选择:
返回self.parent。使用触摸键选择(self.index,touch)
def应用选项(选择了自身、rv、索引):
''响应视图中的项目选择''
self.selected=是否选中
如果选择了以下选项:
self.ids.sm.switch_to(OneLabel())
通过
RV级(回收利用审查):
定义初始(自我,**kwargs):
超级(RV,自我)。\uuuuu初始值(**kwargs)
self.data=[{'text':str(x)}表示范围(100)内的x
类MakeApp(应用程序):
def生成(自):
返回RV()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MakeApp().run()

您需要从应用程序
build()
方法返回
ScreenManager
,然后您只能切换到扩展
屏幕的小部件。您的kv语言字符串中不需要
屏幕管理器
。以下是您的代码,稍作修改即可实现您的目标:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.label import Label
from kivy.properties import BooleanProperty
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.screenmanager import ScreenManager,Screen

Builder.load_string('''
<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
        Rectangle:
            pos: self.pos
            size: self.size
<OneLabel>:
    name:'one'
    Label:
        text:'one'
<RVScreen>:
    name: 'rv'
    RV:
        viewclass: 'SelectableLabel'
        SelectableRecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
            multiselect: False
            touch_multiselect: False
''')
class OneLabel(Screen):
    pass

class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    ''' Adds selection and focus behaviour to the view. '''

class RVScreen(Screen):
    pass

class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            sm.current = 'one'


class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(100)]

sm = ScreenManager()
class MakeApp(App):
    def build(self):
        sm.add_widget(RVScreen())
        sm.add_widget(OneLabel())
        return sm

if __name__ == '__main__':
    MakeApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.recycleview导入recycleview
从kivy.uix.recycleview.views导入RecycleDataViewBehavior
从kivy.uix.label导入标签
从kivy.properties导入布尔属性
从kivy.uix.recycleboxlayout导入recycleboxlayout
从kivy.uix.behaviors导入焦点行为
从kivy.uix.recycleview.layout导入LayoutSelectionBehavior
从kivy.uix.screenmanager导入screenmanager,屏幕
Builder.load_字符串(“”)
:
#绘制背景以指示选择
在以下情况之前:
颜色:
rgba:(.0,0.9,1,3)如果自选,则为其他(0,0,0,1)
矩形:
pos:self.pos
大小:self.size
:
姓名:“一”
标签:
正文:“一”
:
名称:“rv”
房车:
viewclass:“SelectableLabel”
可选择的可循环利用布局:
默认大小:无,dp(56)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
多重选择:错误
触摸多选:错误
''')
一级标签(屏幕):
通过
类SelectableRecycleBoxLayout(焦点行为、布局选择行为、,
可回收性布局):
“将选择和焦点行为添加到视图中。”
类RVScreen(屏幕):
通过
类SelectableLabel(RecycleDataViewBehavior,Label):
''将选择支持添加到标签''
索引=无
selected=布尔属性(False)
可选=布尔属性(真)
def刷新\视图\属性(自身、rv、索引、数据):
''捕获并处理视图更改''
self.index=索引
返回超级(SelectableLabel,self)。刷新\u视图\u属性(
rv、索引、数据)
def on_触控向下(自身,触控):
''在触地时添加选择''
如果是超级(SelectableLabel,self)。打开时触摸下(触摸):
返回真值
如果自碰撞点(*touch.pos)和自选择:
返回self.parent。使用触摸键选择(self.index,touch)
def应用选项(选择了自身、rv、索引):
''响应视图中的项目选择''
self.selected=是否选中
如果选择了以下选项:
sm.current=‘一’
RV级(回收利用审查):
定义初始(自我,**kwargs):
超级(RV,自我)。\uuuuu初始值(**kwargs)
self.data=[{'text':str(x)}表示范围(100)内的x
sm=屏幕管理器()
类MakeApp(应用程序):
def生成(自):
sm.add_小部件(RVScreen())
sm.add_小部件(OneLabel())
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MakeApp().run()
我本来想让你的
RV
类扩展
Screen
以及
RecycleView
,但没能