繁体   English   中英

Gluon 移动应用 NavigationDrawer 后退按钮问题

[英]Gluon mobile app NavigationDrawer back button issue

我正在处理一个带有 FXML 的多视图项目,该项目由 IntelliJ 的 Gluon 插件生成。

当我从主视图导航到辅助视图时,我按下物理 android 设备上的后退按钮,视图变回主视图。 这是正常行为。

问题是 NavigationDrawer 停留在辅助视图上。 您可以观察到这一点,因为您将无法导航到辅助视图。 当您在导航窗格中推送次要时,什么也不会发生。 此行为类似于尝试导航到您当前所在的页面,但也不会执行任何操作。

有谁知道解决方案? 这是一个错误吗? 为 Gluon 报告错误的最佳方式是什么,因为他们不想将所有支持转移到 SO?

NavigationDrawer基本上是一个带有项目列表的弹出窗口,通常这些项目中的每一个都允许选择一个View

如果视图只能通过抽屉访问,那么您不会有任何问题,因为所选项目始终与活动视图相关。

当您通过其他方式(如后退按钮)访问视图时,会出现您遇到的问题。

默认情况下,抽屉列表不会跟踪活动视图以自动选择相关项目。 如果稍后,您尝试选择已选择的项目,则侦听器将不会触发视图切换。

虽然这可以由控件内部完成(传入版本可能会管理它),但很容易实现。

只需在主类上向viewProperty()添加一个侦听器,并且每当视图发生变化时,更新抽屉上的所选项目。 由于这将触发navigationDrawer.selectedItemProperty()的更改,因此在更新选择之前,我们需要删除侦听器,然后再次添加它。

public static final String PRIMARY_VIEW = HOME_VIEW;
public static final String SECONDARY_VIEW = "Secondary View";
public static final String MENU_LAYER = "Side Menu";

private Item primaryItem;
private Item secondaryItem;

private final ChangeListener listener = (obs, oldItem, newItem) -> {
        hideLayer(MENU_LAYER);
        switchView(newItem.equals(primaryItem) ? PRIMARY_VIEW : SECONDARY_VIEW);
    };

@Override
public void init() {
    addViewFactory(PRIMARY_VIEW, () -> new PrimaryView(PRIMARY_VIEW).getView());
    addViewFactory(SECONDARY_VIEW, () -> new SecondaryView(SECONDARY_VIEW).getView());

    NavigationDrawer drawer = new NavigationDrawer();

    primaryItem = new Item("Primary", MaterialDesignIcon.HOME.graphic());
    secondaryItem = new Item("Secondary", MaterialDesignIcon.DASHBOARD.graphic());
    drawer.getItems().addAll(primaryItem, secondaryItem);

    primaryItem.setSelected(true);
    drawer.selectedItemProperty().addListener(listener);

    addLayerFactory(MENU_LAYER, () -> new SidePopupView(drawer));

    viewProperty().addListener((obs, ov, nv) -> {
        drawer.selectedItemProperty().removeListener(listener);
        if (nv.getName().equals(PRIMARY_VIEW)) {
            primaryItem.setSelected(true);
            secondaryItem.setSelected(false);
            drawer.setSelectedItem(primaryItem);
        } else {
            primaryItem.setSelected(false);
            secondaryItem.setSelected(true);
            drawer.setSelectedItem(secondaryItem);
        }
        drawer.selectedItemProperty().addListener(listener);
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM