【问题标题】:Gluon mobile app NavigationDrawer back button issueGluon 移动应用 NavigationDrawer 后退按钮问题
【发布时间】:2016-03-25 09:40:01
【问题描述】:

我正在使用 FXML 处理由 IntelliJ 的 Gluon 插件生成的多视图项目。

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

问题是 NavigationDrawer 停留在辅助视图上。您可以观察到这一点,因为您将无法导航到辅助视图。当您在导航窗格中按次要时,没有任何反应。 此行为类似于尝试导航到您当前所在的页面,但也无济于事。

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

【问题讨论】:

    标签: android mobile gluon


    【解决方案1】:

    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);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多