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