我的两个视图中有2个android本地音频实例。我试图使音频在用户按下“后退”按钮并离开视图时停止播放,因为这不是自动发生的。我查看了文档,并看到了MobileEvent类。我试过没有运气实现它的构造函数。这是我的第一个应用程序,为此我只是自己学习了Java和JavaFX,因此一些帮助将非常有用。我当前的尝试如下。

    public void MobileEvent(javafx.event.EventTarget source,
               javafx.event.EventType<MobileApplication.MobileEvent> BACK_BUTTON_PRESSED) {
    service.backPressed();
}


这是一个Gluon应用程序。

最佳答案

MobileEvent.BACK_BUTTON_PRESSED这样的自定义事件的想法是,您可以使用事件处理程序来订阅它。

例如,如果您创建一个layer并想在用户按下后退按钮时将其关闭:

public BasicView(String name) {
    super(name);

    // create a custom layer
    MobileApplication.getInstance().addLayerFactory("My Layer", () -> new Layer() {
        private final Node root;
        private final double size = 300;

        {
            root = new StackPane(new Button("A custom layer"));
            root.setStyle("-fx-background-color: lightgreen;");
            getChildren().add(root);
            getApp().getGlassPane().getLayers().add(this);

            // Add event handler to listen to Android Back Button Pressed event, hiding the layer
            addEventHandler(MobileApplication.MobileEvent.BACK_BUTTON_PRESSED, e -> {
                    hide();
                    e.consume();
            });
        }

        @Override
        public void hide() {
            setShowing(false);
            super.hide();
        }

        @Override
        public void layoutChildren() {
            root.setVisible(isShowing());
            if (!isShowing()) {
                return;
            }
            root.resize(size, size);
            resizeRelocate(0, 0, size, size);
        }
    });

    Button button = new Button("Show Layer");
    button.setOnAction(e -> MobileApplication.getInstance().showLayer("My Layer"));

    VBox controls = new VBox(15.0, button);
    controls.setAlignment(Pos.CENTER);

    setCenter(controls);
}


如果您创建一个Single View项目,请使用上面的代码片段,然后将其部署到Android设备上,则可以验证当您单击按钮时该图层会显示出来,并且如果您单击了Android后退按钮,它将关闭该图层。

请注意,如果再次单击它,它将关闭应用程序:主视图已经具有此事件的侦听器,这就是应用程序关闭的原因。或者,如果您处于辅助视图中,则通过此事件,您将返回上一个视图。

尽管您可以在代码中的任何时候订阅此事件,就像我在上面的示例中所做的那样,但是已经有其他事件可以更轻松地进行跟踪。例如,所有视图都已使用LifecycleEvent events, like SHOWING or HIDING`。

因此,您可以将以下任何事件的侦听器添加到自定义视图:

public BasicView(String name) {
    super(name);

    Label label = new Label("This is a custom view");

    VBox controls = new VBox(15.0, label);
    controls.setAlignment(Pos.CENTER);

    setCenter(controls);

    setOnShowing(e -> System.out.println("Showing Event"));

    setOnHiding(e -> System.out.println("Hiding Event"));
}


请注意,在您的情况下,您可以轻松找出用户何时离开视图,然后做出相应的反应以调用服务以停止音频:

    setOnHiding(e -> {
        Services.get(MyAudioService.class).ifPresent(service -> service.stop());
    });

07-24 16:02