функциональность кнопки "назад" на android с kivy

В киви, когда я нажимаю кнопку "назад" на своем устройстве android, он выбрасывает меня из приложения. есть ли способ вернуться к предыдущему экрану, используя язык Kivy, а не python? вот что я написал на языке киви:--2-->

<MyAppClass>:
AnchorLayout:
    anchor_x : 'center'
    anchor_y : 'top'
    ScreenManager:
        size_hint : 1, .9
        id: _screen_manager

        Screen:
            name:'screen1'
            StackLayout:
                # irrelevant code

        Screen:
            name:'screen2'
            StackLayout:
                # irrelevant code

Мне нужно манипулировать диспетчером экрана и его экранами из python... если я смогу это сделать, я буду в порядке с python.

3 ответов


Kivy на android привязывает кнопку Назад к esc кнопка так привязка и прослушивание esc кнопка в вашем приложении поможет вам справиться с тем, как ваше приложение ведет себя при нажатии кнопки "Назад".

другими словами, в вашем приложении при тестировании на рабочем столе слушайте клавишу escape с системной клавиатуры, это будет автоматически переведено на кнопку "назад" на вашем устройстве android. Что-то типа:

def on_start():
    from kivy.base import EventLoop
    EventLoop.window.bind(on_keyboard=self.hook_keyboard)

def hook_keyboard(self, window, key, *largs):
    if key == 27:
       # do what you want, return True for stopping the propagation
       return True 

Это, конечно, возможно. Вот краткий пример приложения с методом, который я использую для этого:

from kivy.utils import platform
from kivy.core.window import Window

class ExampleApp(App):
    manager = ObjectProperty()

    def build(self):
        sm = MyScreenManager()
        self.manager = sm
        self.bind(on_start=self.post_build_init)
        return sm

    def post_build_init(self, *args):
        if platform() == 'android':
            import android
            android.map_key(android.KEYCODE_BACK, 1001)

        win = Window
        win.bind(on_keyboard=self.my_key_handler)

    def my_key_handler(self, window, keycode1, keycode2, text, modifiers):
        if keycode1 in [27, 1001]:
            self.manager.go_back()
            return True
        return False

это должно дать правильную основную идею, но несколько замечаний:

  • ScreenManager не отслеживает предыдущие экраны, это до вас, чтобы реализовать это, как вам нравится. В моем примере предполагается, что вы определили класс MyScreenManager с помощью метода go_back.
  • возможно, нет необходимости привязываться к on_start и запускать post_build_init, вот как пример, который я первоначально использовал, сделал это (см. ниже). Это может быть важно иногда, хотя, возможно, если окно не инициализируется, когда build() запускается, и исходная почта списка рассылки предполагает, что автору это было нужно по какой-то причине.
  • пример прослушивает коды ключей 27 или 1001. Как сказал КУА-нон, когда я писал это, первый слушает esc, Так что вы можете получить такое же поведение на рабочем столе.
  • Я не пытался без android.map_key line, но похоже, что это может и не надо.
  • вы упомянули, что хотите использовать язык киви, а не python. Вам нужно сделать некоторый python, чтобы получить этот результат, и я не вижу способа обойти это (на самом деле это не домен языка kv). Я думаю, вы могли бы перенести некоторые вещи в kv, определив событие "go_back" где-то и запустив это, когда клавиша нажата, наряду с привязкой вашего screenmanager для просмотра этого события, но это кажется длинным путем.

Я основал свой код на дискуссии в списке рассылки на https://groups.google.com/forum/#!тема/kivy-пользователи/7rOZGMMIFXI . Возможно, есть лучший способ, но он вполне функциональный.


Я думаю, что я решил это, но должен поблагодарить как @inclement и @qua-non! ваши ответы, ребята привели меня на правильный путь! поэтому в kv я предполагаю, что я дал идентификатор своему менеджеру экрана (см. мой вопрос, где я написал код kv), в python я должен сделать следующее:

    from kivy.core.window import Window
    from kivy.properties import ObjectProperty

    class MyAppClass(FloatLayout):#its a FloatLayout in my case
        _screen_manager=ObjectProperty(None)
        def __init__(self,**kwargs):
            super(MyAppClass,self).__init__(**kwargs)
            #code goes here and add:
            Window.bind(on_keyboard=self.Android_back_click)

        def Android_back_click(self,window,key,*largs):
            if key == 27:
                self._scree_manager.current='screen1'#you can create a method here to cache in a list the number of screens and then pop the last visited screen.
                return True

    class MyApp(App):
        def build(self):
            return MyAppClass()

    if __name__=='__main__':
        MyApp().run()